行为型模式:
行为型模式,共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("[email protected]");
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 [email protected].