设计模式
1.简单工厂模式
构建一个工厂类,根据参数来创建不同的需求类,被创建的类通常具有公共的父类。将对象的创建与使用分离开来,但,新增一个产品就要改变代码添加一个分支,违反了开闭原则。
2、策略模式
将一系列同类型但不同的需求的目标分别创建不同的类(算法),类似余工厂模式创建不同对象。
创建环境类,通过传入的需求(环境)调用需要类(算法)
- 定义一个策略接口,声明算法的抽象方法。(同类型)
- 创建具体的策略类,实现策略接口,封装具体的算法。(不同需求)
- 创建环境类,包含对策略接口的引用,以及一个用于设置具体策略对象的方法。
- 在客户端中创建环境类的对象,并调用其方法来执行具体的算法。
但,需要客户端知道所有的策略类,并传入需要的环境。
3、备忘录模式
我们很多会用到,类似于一种实现或者机制。 像我们常用的回退啊,事务的回滚啊等
4、代理模式
在访问某个类或者对象时,我们不能直接访问或者要对目标做出某些变更,但不能直接修改年目标,我们可以采用代理模式。
建立一个抽象类,目标类实现抽象类,代理同样实现抽象类。在调用目标累时先进过代理类,在代理类中我们可以在相同的方法中,调用目标类的方法在调用前后进行我们的优化改变。 像我们常用的动态代理等
Client → Subject ← RealSubject
↑
│
Proxy
代理模式应用
(1)远程代理
一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
(2)虚拟代理
根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,这样就可以达到性能的最优化。比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,但你还是可以很快打开它,此时你所看到的是所有的文字,但图片却是一张一张地下载后才能看到。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。
(3)安全代理
用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
(4)智能指引
是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。
5、单例模式
单例模式保证只有一个实例
通过private一个静态变量用来判断实例是否存在,并且private构造方法,用来防止外部实例化。留有一个暴露点,通过判断这个 private静态变量 来决定是否创建新实例还是返回已有实例
public class Singleton {
// 私有静态变量,保存唯一实例
private static Singleton instance = null;
// 私有构造函数,防止外部 new
private Singleton() {}
// 公共静态方法,提供全局访问点
public static Singleton getInstance() {
if (instance == null) { // 判断是否已有实例
instance = new Singleton();
}
return instance;
}
}
6、访问者模式
类的结构是稳定的。想要执行不同的操作。
定义访问者接口,构建统一方法重载这个方法,表示对不同部分的不同操作。实现具体的访问者接口,每个接口实现不同的操作
定义元素接口,表示类的不同部分,实现具体的元素接口,调用访问者接口,插入自己(不同的部分),访问者根据传入不同部分调用不同的实现。
7、观察者模式
被观察的对象称为主题,当主题改变时通知所有观察者
定义一个主题接口,实现这个主题为学要观察的对象,当改变时通知观察者
定义一个观察者接口,实现这个观察者,穿件变更方法
客户端代码中创建主题对象和观察者对象,注册观察者到主题中,然后通过主题改变状态,观察者得到通知并进行更新。
8、装饰模式
定义一个接口,实现这个接口1,当我们刚想增强这个接口1但不能直接操作接口1时,通过实现接口2,在接口二中引入接口1,调用接口一并在之后做出增强逻辑。
Client → Component ← ConcreteComponent
↑
│
Decorator ← ConcreteDecoratorA, ConcreteDecoratorB