行為型模式:
行為型模式,共11種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。根據它們的具體技術實作可分為4類,第一類:通過父類與子類的關系進行實作。第二類:兩個類之間。第三類:類的狀态。第四類:通過中間類如下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMxETMzQDN1ETMyYDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
政策模式(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].