1. 程式人生 > >大話設計模式-----(九)橋接模式、命令模式

大話設計模式-----(九)橋接模式、命令模式

橋接模式

將抽象部分與他的實現部分分離,使他們都可以獨立地變化

實現指的是抽象類和他的派生類用來實現自己的物件

就像不同牌子的手機,會有不同的功能,要是抽象手機,然後逐個新增功能,很多功能大家都有,但也有一些特殊的。把功能也抽象出來。 儘量使用合成/聚合,儘量不要使用類繼承。將手機軟體傳入手機類。因為針對抽象介面程式設計。直接呼叫抽象定義的方法。

//手機軟體抽象類
abstract class HandSetSoft{
    public abstract void Run();
} 
//手機軟體具體類

class HandSetGame extends HandSetSoft
{
@Override public void Run() { // TODO Auto-generated method stub System.out.println("執行手機遊戲"); } } class HandSetAddressList extends HandSetSoft{ @Override public void Run() { // TODO Auto-generated method stub System.out.println("執行手機通訊錄"); } }
//手機品牌類

abstract class HandSetBrand{

    HandSetSoft soft;

    public void SetHandSetSoft(HandSetSoft soft){
        this.soft = soft;
    }

    public void Run(){
        soft.Run();
    }

}
//具體手機

class HandSetBrandN extends HandSetBrand{
    @Override
    public void Run(){
        System.out.println("我是N牌手機"
); super.Run(); } } class HandSetBrandM extends HandSetBrand{ @Override public void Run(){ System.out.println("我是M牌手機"); super.Run(); } }

客戶端

public static void main(String[] args) {
        HandSetBrandN n = new HandSetBrandN();
        n.SetHandSetSoft(new HandSetGame());
        n.Run();
        n.SetHandSetSoft(new HandSetAddressList());
        n.Run();
        HandSetBrandM m = new HandSetBrandM();
        m.SetHandSetSoft(new HandSetGame());
        m.Run();

這裡寫圖片描述

用書上的手機例子不是很好。現在的軟體一般直接就可以用。不分手機品牌了~

命令模式

讓行為請求者與行為實現者解耦合

將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌,以及支援可撤銷的操作。

就像開一個燒烤店,不可能廚師來接待你,然後一個一個烤。要一個服務員來傳遞命令,也就是點餐。

先定義一個廚師

//廚師
class Barbecuer{
    //烤羊肉串
    public void BakeMutton(){
        System.out.println("廚師烤羊肉串");
    }
    //烤雞腿
    public void BakeChickenWing(){
        System.out.println("廚師烤雞腿雞腿");
    }
} 

對廚師下達的命令進行抽象,然後具體的繼承類就是烤什麼

//抽象命令

abstract class Command{

    Barbecuer receiverBarbecuer;
    public Command (Barbecuer reBarbecuer){
        this.receiverBarbecuer = reBarbecuer;
    }

    //執行命令
    abstract public void ExcuteCommand();


}

具體燒烤
重寫了toString方法,用來判斷點的燒烤還有沒了

//具體命令類
//烤羊肉串
class BakeMuttonCommand extends Command{

    public BakeMuttonCommand(Barbecuer reBarbecuer) {
        super(reBarbecuer);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void ExcuteCommand() {
        // TODO Auto-generated method stub
        receiverBarbecuer.BakeMutton();
    }

    @Override
    public String toString(){
        return "BakeMuttonCommand";

    }
}

//烤雞腿

class BakeChickenWing extends Command{

    public BakeChickenWing(Barbecuer reBarbecuer) {
        super(reBarbecuer);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void ExcuteCommand() {
        // TODO Auto-generated method stub
        receiverBarbecuer.BakeChickenWing();
    }

    @Override
    public String toString(){
        return "BakeChickenWing";

    }

}

再定義個服務員

//服務員
class Waiter{
    private List<Command> orders = new ArrayList<Command>();

    //設定訂單
    public void SetOrder(Command command){
        if(command.toString()=="BakeChickenWing"){
            System.out.println("抱歉,沒有雞腿了");
        }
        else{
            orders.add(command);
            System.out.println("增加訂單:"+command.toString());
        }
    }

    public void CancelOrder(Command command){
        orders.remove(command);
        System.out.println("取消訂單:"+command.toString());
    }

    //通知廚師訂單

    public void Notify(){
        for(Command command :orders){
            command.ExcuteCommand();
        }
    }
}

客戶端

    //先說明誰做燒烤,命令接受者
        Barbecuer boyBarbecuer = new Barbecuer();
        Command bakeMuttonCommand = new BakeMuttonCommand(boyBarbecuer);
        Command backChickWingCommand = new BakeChickenWing(boyBarbecuer);

        Waiter girl = new Waiter();
        //點餐
        girl.SetOrder(backChickWingCommand);
        girl.SetOrder(bakeMuttonCommand);
        girl.SetOrder(bakeMuttonCommand);

        girl.Notify();

這裡寫圖片描述

定義個命令接受者,抽象命令,命令的建構函式傳入命令接受者。接受者執行命令。
定義命令傳達者。進行List來增刪命令和判斷,傳達呼叫命令。
命令傳達者接受客戶端傳入的命令。執行。
嗯,3月底沒有將設計模式看完。原因很多。但就是沒看完。要加油了。
那天很開心。謝謝老師。