大話設計模式-----(九)橋接模式、命令模式
阿新 • • 發佈:2019-02-12
橋接模式
將抽象部分與他的實現部分分離,使他們都可以獨立地變化
實現指的是抽象類和他的派生類用來實現自己的物件
就像不同牌子的手機,會有不同的功能,要是抽象手機,然後逐個新增功能,很多功能大家都有,但也有一些特殊的。把功能也抽象出來。 儘量使用合成/聚合,儘量不要使用類繼承。將手機軟體傳入手機類。因為針對抽象介面程式設計。直接呼叫抽象定義的方法。
//手機軟體抽象類
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月底沒有將設計模式看完。原因很多。但就是沒看完。要加油了。
那天很開心。謝謝老師。