天天看點

Java設計模式之--政策模式(strategy)

行為型模式:

 行為型模式,共11種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。根據它們的具體技術實作可分為4類,第一類:通過父類與子類的關系進行實作。第二類:兩個類之間。第三類:類的狀态。第四類:通過中間類如下圖:

Java設計模式之--政策模式(strategy)

政策模式(strategy)

概念:

定義一系列的算法,把每一個算法單獨實作并封裝, 并且使它們可互相替換。使得算法可獨立于使用它的客戶而變化。客戶可以決定采用哪種政策(算法)

案例:

Message 選擇通過Email 還是短訊發送資訊給特定聯系人

來看類圖:

Java設計模式之--政策模式(strategy)

聯系人 類

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].