行为型模式:
行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。根据它们的具体技术实现可分为4类,第一类:通过父类与子类的关系进行实现。第二类:两个类之间。第三类:类的状态。第四类:通过中间类如下图:
策略模式(strategy)
概念:
定义一系列的算法,把每一个算法单独实现并封装, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化。客户可以决定采用哪种策略(算法)
案例:
Message 选择通过Email 还是短讯发送信息给特定联系人
来看类图:
联系人 类
public class PhoneContract { private String email; private String phone; private String name; public String getEmail() { return email; } public PhoneContract setEmail(String email) { this.email = email; return this; } public String getName() { return name; } public PhoneContract setName(String name) { this.name = name; return this; } public String getPhone() { return phone; } public PhoneContract setPhone(String phone) { this.phone = phone; return this; } }
MessageSendor接口
public interface MessageSendor { public void send(PhoneContract phoneContract,String message); }
public class SMSMessage implements MessageSendor { @Override public void send(PhoneContract phoneContract, String message) { sendMessage(phoneContract.getName(),phoneContract.getPhone(),message); } private void sendMessage(String name,String address,String message){ System.out.println(String.format("%s sendMessage %s to %s %s.", this.getClass().getName(),message,name,address)); } }
public class EmailMessage implements MessageSendor { @Override public void send(PhoneContract phoneContract, String message) { sendMessage(phoneContract.getName(),phoneContract.getEmail(),message); } private void sendMessage(String name,String address,String message){ System.out.println(String.format("%s sendMessage %s to %s %s.", this.getClass().getName(),message,name,address)); } }
MessageClient 类
public class MessageClient { public MessageSendor getMessageSendor() { return messageSendor; } public void setMessageSendor(MessageSendor messageSendor) { this.messageSendor = messageSendor; } private MessageSendor messageSendor; public MessageClient(MessageSendor sendor){ setMessageSendor(sendor); } public void sendMessage(PhoneContract phoneContract,String message){ if(null!=messageSendor){ messageSendor.send(phoneContract, message); } } }测试类:public class WorkClass { public void test() { PhoneContract phoneContract = new PhoneContract().setName("Jim").setPhone("+8613012345678").setEmail("Jim@gmail.com"); MessageSendor messageSendor = new SMSMessage(); MessageClient messageClient = new MessageClient(messageSendor); messageClient.sendMessage(phoneContract, "hello"); messageClient.setMessageSendor(new EmailMessage()); messageClient.sendMessage(phoneContract, "lunch"); } }测试输出:I/System.out: com.example.qinghua_liu.myapplication.designpatten.action.SMSMessage sendMessage hello to Jim +8613012345678. I/System.out: com.example.qinghua_liu.myapplication.designpatten.action.EmailMessage sendMessage lunch to Jim Jim@gmail.com.