模板模式
模版方法定义了算法的步骤,把这些步骤的实现延迟到了子类。
模版方法模式为我们提供了一种代码复用的重要技巧。
模版方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
为了防止子类改变模版方法中的算法,可以将模版方法声明为final
模版方法和策略模式都封装了算法,一个用组合(策略模式),一个用继承(模版方法)。
泡咖啡和泡茶的案例
1.定义一个模板类(流程方法(final),各步骤方法(抽象方法),加上判断方法,通过子类不同的实现来改变流程中是否执行(钩子))
2.具体的流程来实现模板的步骤方法
3.通过多态,调用父类的流程方法
策略模式
定义一组算法,将每个算法都封装起来,使得它们之间可以相互替换。策略模式让算法独立于调用它的客户端而独立变化。
玩枪战类游戏,可以根据不同战场情况,切换枪支。
抽象策略:通常由接口或抽象类实现
具体策略:实现抽象策略接口
环境类:类中持有对一个抽象策略的引用,set方法和get方法(给环境中传入什么策略,就会实现不同的方法)
优点在于:可以轻易的扩展与改变策略,可以动态改变对象的行为。
缺点在于:客户端必须知道所有的策略类,并自行决定使用哪一种。每个具体的策略都会产生一个新类,这样会造成很多策略类。
观察者模式
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
1.定义一个抽象被观察者接口
声明了添加、删除、通知观察者方法
2.定义一个抽象观察者接口
声明一个更新的方法
3.定义被观察者(相当于微信公众号)
对Observerable接口的三个方法进行了具体实现,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。
4.定义具体观察者,微信公众号的具体观察者为用户User
适配器模式
情景模拟:一个笔记本需要三孔插座,现在只有一个两孔的插座,所以需要适配器。
1.抽取出三孔插座的特征,即定义一个接口。
2.一个现成的两孔插座
3.适配器:实现三孔插座的特征(接口),内部保留一个两孔插座引用,在实现的方法中调用两孔插座的功能。
4.笔记本调用三孔插座时,可以把适配器传入。
public interface ThreePlugif {
public void powerthree();
}
package com.Adapter;
public class Twoplug {
public void powerwithtwo(){
System.out.println("使用二项插座供电");
}
}
package com.Adapter;
public class Adapterplug implements ThreePlugif{
private Twoplug plug;
public Adapterplug(Twoplug plug) {
this.plug=plug;
// TODO 自动生成的构造函数存根
}
public void powerthree() {
// TODO 自动生成的方法存根
System.out.println("通过转化");
plug.powerwithtwo();
}
}
package com.Adapter;
public class Laptop {
private ThreePlugif plug;
public Laptop(ThreePlugif plug) {
this.plug = plug;
}
public void charge(){
plug.powerthree();
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Twoplug twoplug=new Twoplug();
ThreePlugif plug =new Adapterplug(twoplug);
Laptop laptop=new Laptop(plug);
laptop.charge();
}
}