行为型模式(Behavioral Pattern)用来识别对象之间的常用交流模式并加以实现。如此,可在进行这些交流活动时增强弹性。
职责链模式 Chain of Responsibility :避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
使用频率:★★☆☆☆
命令模式 Command Pattern :将一组行为抽象为对象,实现二者之间的松耦合。
使用频率:★★★★☆
解释器模式 Interpreter Pattern:定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的 “语言” 是指使用规定格式和语法的代码。
使用频率:★☆☆☆☆
迭代器模式 Iterator Pattern :提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
使用频率:★★★★★
中介者模式 Mediator Pattern :用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。
使用频率:★★☆☆☆
备忘录模式 Memento Pattern :在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
使用频率:★★☆☆☆
观察者模式 Observer Pattern :定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
使用频率:★★★★★
状态模式 State Pattern:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用频率:★★★☆☆
策略模式 Strategy Pattern :定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
使用频率:★★★★☆
模板方法模式 Template Method Pattern :定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术。
使用频率:★★★☆☆
访问者模式 Visitor Pattern :提供一个作用于某对象结构中的各元素的操作表示,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
使用频率:★☆☆☆☆
一个商店老板能处理小于0.5的优惠需求,销售经理能处理小于0.2优惠需求,销售员能处理小于0.1优惠需求,可以使用职责链模式:
老板类(能处理0.5以下优惠)
//老板 public class Boss extends PriceHandle{ @Override public void discount(double discount) { if(discount<0.5){ System.out.println("老板处理了打折,折扣为:"+discount); }else{ System.out.println("老板拒绝了打折,折扣为:"+discount); } } }销售经理类(能处理0.2以下优惠)
//销售经理 可以处理20%以内的折扣 public class Manager extends PriceHandle{ @Override public void discount(double discount) { if(discount<0.2){ System.out.println("销售经理处理了打折,折扣为:"+discount); }else{ if(priceHandle!=null) { //交给老板处理 priceHandle.discount(discount); }else { //老板不在 拒绝折扣 System.out.println("销售经理拒绝了打折,折扣为:"+discount); } } } }销售员类(能处理0.1以下优惠)
//销售员 可以处理10%以内的折扣 public class Market extends PriceHandle{ @Override public void discount(double discount) { if(discount<0.1){ System.out.println("销售员处理了打折,折扣为:"+discount); }else{ if(priceHandle!=null) { //交给销售经理处理 priceHandle.discount(discount); }else { //销售经理不在 拒绝折扣 System.out.println("销售员拒绝了打折,折扣为:"+discount); } } } }顾客类
//顾客 public class Customer { private PriceHandle pHandle; public void setPHandle(PriceHandle pHandle) { this.pHandle = pHandle; } public void discountReq(double discount){ if(pHandle!=null){ pHandle.discount(discount); } } }命令执行者
public class Receiver { void receiver(){ System.out.println("接收命令,并执行"); } }命令调用者
//调用命令类 public class Invoker { private Command command; public Invoker(Command command) { this.command = command; } //执行命令 void invoke() { if(command!=null) { command.command(); } } }并且关系解释器
//并且关系 public class AndExpression implements Expression { private Expression e1; private Expression e2; public AndExpression(Expression e1, Expression e2) { this.e1 = e1; this.e2 = e2; } @Override public boolean interpret(String context) { if (e1 != null && e2 != null) { return e1.interpret(context) && e2.interpret(context); } return false; } }或者关系解释器
//或者关系 public class OrExpression implements Expression { private Expression e1; private Expression e2; public OrExpression(Expression e1, Expression e2) { this.e1 = e1; this.e2 = e2; } @Override public boolean interpret(String context) { if (e1 != null && e2 != null) { return e1.interpret(context) || e2.interpret(context); } return false; } }调用者
public class TerminalExpression implements Expression { private String data; public TerminalExpression(String data) { this.data = data; } @Override public boolean interpret(String context) { if (data != null) { return data.contains(context); } return false; } }定义书实体
//书籍类 public class Book { //名称 private String name; //价格 private String price; public Book(String name, String price) { this.name = name; this.price = price; } }定义书集合 接口
//书集合 接口 public interface BookAggregate { //添加书籍 void addCourse(Book book); //移除书籍 void removeCourse(Book book); //获取书籍迭代器 Iterator getBookIterator(); }定义迭代器接口
//迭代器接口 public interface Iterator { // 获取下一本书籍元素 Book nextBook(); //是否是最后一本 boolean isLast(); }书籍集合 具体实现类
//书籍集合 具体实现类 public class BookAggregateImpl implements BookAggregate { private List<Book> bookList = new ArrayList<>(); @Override public void addCourse(Book book) { bookList.add(book); } @Override public void removeCourse(Book book) { bookList.remove(book); } @Override public Iterator getBookIterator() { return new BookIterator(bookList); } }具体书籍迭代器
//具体书籍迭代器 public class BookIterator implements Iterator { private List<Book> bookList; private int position; public BookIterator(List<Book> bookList) { this.bookList = bookList; } @Override public Book nextBook() { if (bookList != null) { Book book = bookList.get(position); position++; return book; } return null; } @Override public boolean isLast() { if (bookList != null) { return position == bookList.size(); } return false; } }租客需要租房,可以通过中介找到房主租房子,具体中介者模式实现:
抽象中介者
//抽象中介者类 public abstract class Mediator { public abstract void contact(String message,Person person); }抽象用户类
//抽象用户类 public abstract class Person { protected String name; protected Mediator mediator; public Person(String name,Mediator mediator){ this.name = name; this.mediator = mediator; } }房主类
//房主类 public class User1 extends Person { public User1(String name, Mediator mediator) { super(name, mediator); } //与中介者联系 public void contact(String message){ mediator.contact(message, this); } // 获取信息 public void getMessage(String message){ System.out.println("房主:" + name +",获得信息:" + message); } }租客类
//租客类 public class User2 extends Person { public User2(String name, Mediator mediator) { super(name, mediator); } //与中介者联系 public void contact(String message){ mediator.contact(message, this); } // 获取信息 public void getMessage(String message){ System.out.println("租客:" + name +",获得信息:" + message); } }中介者具体对象
//中介者具体对象 public class User extends Mediator { //房主 private User1 user1; //租客 private User2 user2; public void setUser1(User1 user1) { this.user1 = user1; } public void setUser2(User2 user2) { this.user2 = user2; } @Override public void contact(String message, Person person) { if (person == user1) { //房主 user1.getMessage(message); } else { //租客 user2.getMessage(message); } } }观察者接口
//观察者接口 public interface Observer { //更新消息,当被观察者notifyObserver被调用时,update方法将被触发 void update(String message); }被观察者接口
//被观察者接口 public interface Observerable { //注册观察者 void registerObserver(Observer o); //反注册观察者 void removeObserver(Observer o); //通知观察者更新消息 void notifyObserver(); }观察者实现类
//观察者类(用户) public class User implements Observer { //用户名 private String name; public User(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + " 收到消息:" + message); } }被观察者实现类
//被观察者具体类(推送消息服务) public class PushObserver implements Observerable { private List<Observer> observerList; private String msg; public PushObserver() { observerList = new ArrayList<>(); } @Override public void registerObserver(Observer o) { observerList.add(o); } @Override public void removeObserver(Observer o) { observerList.remove(o); } @Override public void notifyObserver() { //通知所有已注册的观察者用户 for (Observer observer : observerList) { observer.update(msg); } } //推送一条消息 public void pushMsg(String msg) { this.msg = msg; System.out.println("推送系统推送消息:" + msg); notifyObserver(); } }状态上下文
//状态上下文 public class Context { //当前状态 private State state; //获取当前状态呢 public State getState() { return state; } //设置当前状态 public void setState(State state) { this.state = state; } }状态接口
//定义状态接口 public interface State { //执行操作 void doAction(Context context); }启动状态类
//启动状态类 public class StartState implements State { @Override public void doAction(Context context) { System.out.println("正处于启动状态"); context.setState(this); } }停止状态类
//停止状态类 public class StopState implements State{ @Override public void doAction(Context context) { System.out.println("正处于停止状态"); context.setState(this); } }策略具体实现A
//具体策略类A public class ConcreteStrategyA implements Strategy { @Override public void algorithmInterface() { System.out.println("具体策略类A实现类策略"); } }策略具体实现B
//具体策略类B public class ConcreteStrategyB implements Strategy { @Override public void algorithmInterface() { System.out.println("具体策略类B实现类策略"); } }策略上下文
//策略上下文类 public class Context { //持有一个具体策略的对象 private Strategy strategy; //构造函数,需要传入一个具体策略对象 public Context(Strategy strategy){ this.strategy = strategy; } //执行策略方法 public void contextInterface(){ strategy.algorithmInterface(); } }盒子抽象模版类
//制作盒子模版 public abstract class Box { //开始制作 final void startMake() { //选取材料 seek(); //切割材料 cutting(); //焊接材料 welding(); //打磨抛光外形 polish(); } protected abstract void seek(); protected abstract void cutting(); protected abstract void welding(); void polish() { System.out.println("使用打磨机器打磨完成"); } }具体铁盒子
//铁盒子 public class IronBox extends Box{ @Override protected void seek() { System.out.println("使用木头做材料"); } @Override protected void cutting() { System.out.println("使用普通锯子切割"); } @Override protected void welding() { System.out.println("使用打孔方式相接"); } }具体木盒子
//木头盒子 public class WoodBox extends Box{ @Override protected void seek() { System.out.println("使用钢铁做材料"); } @Override protected void cutting() { System.out.println("使用电锯切割"); } @Override protected void welding() { System.out.println("使用电焊相接"); } }人类抽象类
//抽象人类 public abstract class Human { //抽象接受访问 abstract void accept(Visitor visitor); }访问方式抽象类
//抽象的访问方式类 public abstract class Visitor { //访问中国人 public abstract void visitChinese(Chinese chinese); //访问美国人 public abstract void visitAmerican(American american); }人类具体实现(中国人)
//中国人 public class Chinese extends Human { @Override void accept(Visitor visitor) { //中国人处理事件 visitor.visitChinese(this); } }人类具体实现(美国人)
//美国人 public class American extends Human{ @Override void accept(Visitor visitor) { //美国人处理事件 visitor.visitAmerican(this); } }具体访问类(吃饭)
//具体访问类(吃饭) public class EatVisitor extends Visitor { @Override public void visitChinese(Chinese chinese) { System.out.println("中国人使用筷子吃饭"); } @Override public void visitAmerican(American american) { System.out.println("美国人使用刀叉吃饭"); } }具体访问类(头发)
//具体访问类(头发) public class HairVisitor extends Visitor { @Override public void visitChinese(Chinese chinese) { System.out.println("中国人黑色头发"); } @Override public void visitAmerican(American american) { System.out.println("美国人金色头发"); } }