
设计模式
amadeus_liu2
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
设计模式:22-调停者模式(中介者模式)
一、适用场景:中介者模式提供了一个中介类来处理不同类之间的通信,降低各个类的相互耦合。比如同事之间的沟通,并不直接找对方,而是把消息发给项目管理者,由管理者去发送消息。 二、示例 1.创建抽象调停者类 package cn.edu.tju.app; public abstract class Mediator { public abstract void sendMessage(Colleague colleague,String name,String content); public原创 2022-01-21 16:31:10 · 910 阅读 · 0 评论 -
设计模式:21-组合模式
一、适用场景:表示对象的【整体–部分】树形层次结构,同时忽略单个对象和组合对象的差异。比如一颗树,是由分支节点和叶子结点组成的层次结构,同时,我们希望给用户提供统一的接口对结点进行操作,不论是分支结点还是叶子结点 二、示例。 1.定义抽象的结点类: package cn.edu.tju.app; public abstract class TreeNode { private String content; public String getContent() { ret原创 2022-01-20 21:04:48 · 567 阅读 · 0 评论 -
设计模式:20-备忘录
一、使用场景:有时候需要将对象状态保存到另一个对象种,在需要的时候进行恢复,比如打游戏时的存盘。 二、示例 1.创建备忘录类,用于保存状态信息: package cn.edu.tju.app; public class Memento { private int state; public int getState() { return state; } public void setState(int state) { this.sta原创 2022-01-20 20:05:03 · 2309 阅读 · 0 评论 -
设计模式:19-状态模式
一、适用场景:对象的行为由其当前所属的状态决定的场景。比如微信支付,用户的取消支付这个行为,具体要做什么是由当前的支付状态决定的,当前的支付状态不通,取消支付这个行为会走不同的逻辑。 二、示例 1.定义一个支付状态抽象类: package cn.edu.tju.app; public abstract class PaymentState { public abstract void continuePayment(); public abstract void cancelPaymen原创 2022-01-18 09:33:29 · 530 阅读 · 0 评论 -
设计模式:18-访问者模式
一、适用场景:对象包含的属性基本不变,但是经常需要在此对象结构上定义新的操作。比如车险公司,它的保险项基本不变,但是,经常需要针对不同的用户给出不同的优惠政策,第一年没有折扣,第二年打八折,等等。 二、示例。 1.定义一个车险抽象类,其中acceptVisit接口用来给访问者提供服务。 package cn.edu.tju.app; public abstract class CarInsurance { public abstract void acceptVisit(CarInsuranceV原创 2022-01-17 10:47:34 · 330 阅读 · 0 评论 -
设计模式:17-享元模式
1.适用场景:主要用于减少创建对象的数量,尝试重用现有的同类对象,只有当未找到匹配的对象,则创建新对象。 2.示例:java中的String类为典型的享元模式。 package cn.edu.tju.app; public class FlyweightTest { public static void main(String[] args) { String str1="hello"; String str2="hello"; String st原创 2022-01-16 20:59:47 · 213 阅读 · 0 评论 -
设计模式:16-责任链模式
一、适用场景:一个产品需要经过多个环节进行处理,类似于生产的流水线,每一个处理步骤只完成自己的责任,然后交给下一个环节进行处理。 二、典型应用:Netty的多个ChannelInboundHandlerAdapter的子类组成一个处理的责任链,分别进行处理。 1.引入Netty依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:原创 2022-01-11 22:14:47 · 296 阅读 · 0 评论 -
设计模式:15-原型模式
一、适用场景:通过已经存在的对象直接克隆出新对象的场景。比如有一个Person对象,其各个属性都已经设置完成,现在需要克隆出一个新的对象并进行少量修改。 二、示例 1.姓名类(Name)定义 package cn.edu.tju.app; public class Name implements Cloneable{ private String firstName; private String lastName; public String getFirstName() {原创 2022-01-10 22:29:40 · 209 阅读 · 0 评论 -
设计模式:14-迭代器模式
一、迭代器模式提供一种方法来访问一个容器对象中的各个元素,使该对象的内部细节对外部是隐藏的。 二、示例,一个球类迭代器类包含了football、volleyball、baseball等各个元素,该类提供了两个方法hasNext()和next()方法用来对各个元素进行迭代 package cn.edu.tju.app; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Ba原创 2022-01-10 09:50:31 · 147 阅读 · 0 评论 -
设计模式:13-适配器模式
一、应用场景:原本有不能一起工作的两个类,现在将其中的一个类通过适配器类包装起来给另一个类用。 二、示例: package cn.edu.tju.app; import java.io.*; public class AdapterTest { public static void main(String[] args) throws Exception{ InputStream inputStream=new FileInputStream("c:\\00\\00.txt");原创 2022-01-09 22:21:46 · 304 阅读 · 0 评论 -
设计模式:12-抽象工厂
一、抽象工厂是工厂方法模式的进一步升级,它消除了对象创建过程中的与不同工厂类的耦合 二、示例代码 1.定义抽象类 package cn.edu.tju.app; //定义交通工具抽象类 public abstract class Vehicle { //定义"启动"抽象方法 public abstract void start(); } 2.定义上述抽象类的2个实现类 package cn.edu.tju.app; public class Car extends Vehicle {原创 2022-01-03 19:59:55 · 280 阅读 · 0 评论 -
设计模式:11-简单工厂、静态工厂、工厂方法
一、简单工厂:使用工厂类代替new 来创建对象 1.定义抽象类 package cn.edu.tju.app; //定义交通工具抽象类 public abstract class Vehicle { //定义"启动"抽象方法 public abstract void start(); } 2.定义上述抽象类的2个实现类 package cn.edu.tju.app; public class Car extends Vehicle { @Override public原创 2022-01-02 20:42:30 · 594 阅读 · 0 评论 -
设计模式:10-装饰器模式
一。适用场景:在一个现有类增加新的功能的场景,基本的思路是用类的聚合代替继承。该模式和桥接模式比较相似。 二。比如,有一个形状(Shape)接口(interface),定义如下: package cn.edu.tju.app; public interface Shape { void drawIt(); } 其有两个实现类:Rectangle和Circle, package cn.edu.tju.app; public class Rectangle implements Shape {原创 2021-12-29 22:54:44 · 231 阅读 · 0 评论 -
设计模式:09-模板方法模式
一。适用场景:类给外部提供的方法中的步骤是固定的,每一个步骤对应类中的一个方法。可以将这些方法定义为抽象方法,由子类实现这些抽象方法。 二。比如,体育比赛,其中的基本步骤都是固定的:开始比赛、比赛进行、结束比赛。可以定义一个抽象类SportsGame,其提供一个对外的接口haveASportsGame(),并定义3个抽象方法:startGame(),inGame(),stopGame() package cn.edu.tju.app; public abstract class SportsGame {原创 2021-12-28 16:41:52 · 206 阅读 · 0 评论 -
设计模式:08-外观模式
1.适用场景:一个系统有多个子系统,每个子系统有相应的接口。现在新建一个接口来封装现有的不同系统的接口,来为外界提供同一的服务。 2.示例,我们在京东购物,京东APP就充当了“外观”的角色,当我们下单后,它会分别调用不同的子系统的接口,最终把商品送到我们手中。 package cn.edu.tju.app; public class ProductService { public void prepareProduct(String productName,int count){原创 2021-12-27 10:58:27 · 166 阅读 · 0 评论 -
设计模式:07-桥接模式
一。适用场景:某类事物的属性在两个及以上的维度发生变化。 二。示例。比如跑车,有品牌的不同,有颜色的不同。可以定义一个跑车接口, package cn.edu.tju.app; public interface SportsCar { //描述跑车的品牌信息 void describe(); } 然后定义连个实现类,来分别表示不同品牌的跑车, package cn.edu.tju.app; public class BenzSportsCar implements SportsCar原创 2021-12-23 22:41:26 · 510 阅读 · 0 评论 -
设计模式:06-策略模式
一。使用场景:对某个行为有多种算法的情形。比如电商促销,计算商品价格,6.18有相应的价格计算方法,11.11有相应的价格计算方法。可以将价格计算方法封装成策略类。 二。代码实现。 1.定义价格计算接口 package cn.edu.tju.app; public interface DiscountStrategy { double getDiscountPrice(double price); } 2.定义计算打折后价格的策略类。 package cn.edu.tju.app; publ原创 2021-12-22 09:51:50 · 232 阅读 · 0 评论 -
设计模式:05-命令模式
一。适用场景:将对象进行的操作与对象本身进行分离的场景。 二。示例。比如一个整形数组,可以按照升序和降序进行排序。可以定义一个接口,该接口包含两个命令:ascendSort(升序排序)和descendSort(降序排序)。 接口定义如下: package cn.edu.tju.app; public interface SortCommand { void ascendSort(int[] array); void descendSort(int [] array); } 然后定义两个原创 2021-12-21 16:05:12 · 135 阅读 · 0 评论 -
设计模式:04-构建者模式
一。适用场景:构造比较复杂的对象。这种场景需要两个类:一个类是原始类,另一个是构建者类,用于构建原始类的对象。比如,一个Computer类,一个ComputerBuilder类,用于构建Computer类对象。 二。常用的两种方式: 1。原始类和构建者类为独立的类。 2。构建者类为原始类的内部静态类。 三。第二种方式的常用写法 例如Computer类,该类有2个属性cpu和memory,首先按照通常的方法定义该类,示例代码如下: package cn.edu.tju.app; public class Co原创 2021-12-18 19:47:21 · 127 阅读 · 0 评论 -
设计模式:03-单例模式
一.使用单例模式的场景:有些时候某个类的实例只需要一个而不需要多个的时候,比如一些Factory类。 二。常用的几种单例构造方法: 1.饿汉模式: 示例代码如下: package cn.edu.tju.app; import java.util.Date; public class SimpleSingleton { private static SimpleSingleton instance=new SimpleSingleton(); //构造方法,private,防止通过new来原创 2021-12-17 15:17:55 · 681 阅读 · 0 评论 -
设计模式:02-观察者模式
一、使用场景: 适用于当一个对象的状态发生变化时主动去通知另一个对象的场景。 二、使用步骤: 1.定义被观察者类,该类继承java.util.Observable,并在类中提供一个给外部进行调用的方法,在该方法中需要进行两部操作: setChanged(); notifyObservers(xxx); 其中第二个方法调用中传入的值就是观察者收到的值。 示例类如下: package cn.edu.tju.app; import java.util.Observable; public class Pric原创 2021-12-16 15:00:02 · 817 阅读 · 0 评论 -
设计模式:01-代理模式
一。使用代理模式的场景:对已经开发好的类进行功能增强(添加或修改),比如有一个接口: package cn.edu.tju.service; public interface Living { void eat(); void drink(); } 以及该接口的一个实现类: package cn.edu.tju.app; import cn.edu.tju.service.Living; public class ChinesePerson implements Living {原创 2021-12-15 10:19:32 · 696 阅读 · 0 评论