介紹幾種不重要的設計模式
阿新 • • 發佈:2019-01-23
橋接模式
當一個類的子類出現層次(或者是不同維度)關係的時候就會用到橋接模式。比如說我現在要送禮物,禮物是一個類。它的子類從送給誰這個維度來考慮有送給領導的送給女朋友的之分,同時從送什麼的維度來考慮有冬蟲夏草和戒指之分。這就導致了子類維度之間的混亂。這時就需要在一個子類中新增另一個子類的引用。比如說在送給女朋友的禮物這個子類中新增戒指的引用。換句話說就是把其中的一個子類當做是禮物的子類,其他的屬性都當做是這個禮物的屬性。說道這裡好像和平常的程式設計沒有什麼兩樣,確實很多的設計模式在技術層面沒有什麼兩樣他們的區別只是在語義上的不同。下圖展示了送給老闆的冬蟲夏草。
命令模式
命令模式就是同一個方法根據傳入的命令不同而執行不同的動作。比如說女朋友讓我做一些事情。當她發出逛街購物的命令時我就執行購物的動作。當她發出抱抱的動作的時候我就會抱住她。當然命令模式一般還用在一個操作的撤銷上面在這裡就不展開敘述了。下面程式碼就展示了上述的情景。
命令介面
package command;
public abstract class Command {
public abstract void execute();
public abstract void unDo();
}
購物命令
package command; public class ShoppingCommand extends Command{ @Override public void execute() { System.out.println("shopping"); } @Override public void unDo() { System.out.println("no shopping"); } }
擁抱命令
package command;
public class HugCommand extends Command{
@Override
public void execute() {
System.out.println("hug");
}
@Override
public void unDo() {
System.out.println("open my arms");
}
}
男孩類
package command; public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void doSomething(Command cmd) { cmd.execute(); } }
MM類
package command;
import java.util.ArrayList;
import java.util.List;
public class MM {
private String name;
private List<Command> cmds = new ArrayList();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void order(Boy b) {
cmds.add(new ShoppingCommand());//想要更換命令時直接跟換子類就ok
cmds.add(new HugCommand());
for(Command cmd : cmds) {
b.doSomething(cmd);
}
}
public static void main(String[] args) {
MM mm = new MM();
mm.order(new Boy());
}
}
狀態模式
簡單來說狀態模式就是在執行同一個方法時會根據狀態的不同而而不同。比如說美眉在高興的時候的笑容就是甜甜的笑容,在難過時的笑容就是苦笑。說白了也就是高興時一套東西難過時一套東西。這讓我們想起了抽象工廠模式。下面程式碼展示了狀態模式。
狀態類
package state;
public abstract class State {
public abstract void smile();
public abstract void cry();
public abstract void say();
}
開心的狀態
package state;
public class HappyState extends State{
@Override
public void smile() {
System.out.println("高興的笑");
}
@Override
public void cry() {
System.out.println("高興的哭");
}
@Override
public void say() {
System.out.println("高興的說");
}
}
難過的狀態
package state;
public class UnHappyState extends State{
@Override
public void smile() {
System.out.println("難過的笑");
}
@Override
public void cry() {
System.out.println("難過的哭");
}
@Override
public void say() {
System.out.println("難過的說");
}
}
MM類
package state;
public class MM {
private String name;
private State state = new HappyState();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void smile() {
state.smile();
}
public void cry() {
state.cry();
}
public void say() {
state.say();
}
public static void main(String[] args) {
MM mm = new MM();
mm.cry();
}
}
最後感謝(老馬)馬士兵老師!