行爲型模式(11種):
策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、
備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
什麼是行爲模式:
行爲模式就是封裝一段操作,例如策略模式,只用在方法中傳入參數1和2,可以得出3,也可以得出2,這之中操作就是行爲
策略模式
對某一行爲進行抽象化
public interface Handle {
int doSomething(int a,int b);
}
具體化的內容是策略的具象
public class Say1 implements Handle{
@Override
public int doSomething(int a,int b) {
return (a*b);
}
}
public class Say2 implements Handle{
@Override
public int doSomething(int a,int b) {
return (a+b);
}
}
對行爲進行封裝
這段代碼和簡單代理模式很像,講解下其中的困惑點
簡單代理模式中,代理類知道被代理類的行爲,
因爲代理類與被代理類 *實現同一個接口*,因此代理類與被代理類的結構是相同的;
而策略模式中,策略容器並不知道內部策略的詳細信息,
因爲容器並沒有實現與內部策略相同的接口,即容器與內部策略只是簡單的組合關係,
容器只是將內部策略的行爲抽取出來,進行了統一的實現
public class HandleStrategy {
private Handle h;
private HandleStrategy() {}
public HandleStrategy(Handle h) {
this.h = h;
}
public int doSomething(int a,int b) {
h.doSomething(a+b);
}
}
調用
public class DoMain {
public static void main(String[] args) {
HandleStrategy hs1 = new HandleStrategy(new Say1());
hs1.doSomething(1,1);
HandleStrategy hs2 = new HandleStrategy(new Say2());
hs2.doSomething(1,1);
}
}
模板方法模式
建立一個模板
public abstract class Game {
public abstract void doSomething1();
public abstract void doSomething2();
public abstract void doSomething3();
這裏定義了模板,final修飾是關鍵
public final void doSomethings() {
doSomething1();
doSomething2();
doSomething3();
};
}
模板實現
public class SayGame extends Game{
public void doSomething1() {
System.out.println("1");
}
public void doSomething2() {
System.out.println("2");
}
public void doSomething3() {
System.out.println("3");
}
}
調用
public class DoMain {
public static void main(String[] args) {
Game g = new SayGame();
g.doSomethings();
}
}
備忘錄模式
*** 意圖:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態 ***
備忘錄模式分爲三個部分 : 狀態,操作,狀態倉庫
狀態,就是模擬封裝中的狀態
狀態
public class Status {
private String status;
private Status() {}
public Status(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
}
猜測:之所以把操作和倉庫解耦分開爲兩個對象,可能是這塊可能有不同形式的重寫
例如這裏的status是String類型,其他狀態可能是自定義類型,
如果不解耦每次重寫都會重寫倉庫部分
操作
public class Handle {
private String status;
public Handle() {}
public void setStatus(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
public Status createStatusObj() {
return new Status(status);
}
public String getStatusAttr(Status status) {
return status.getStatus();
}
}
狀態倉庫
public class StatusWarehouse {
private List<Status> list = null;
public StatusWarehouse() {
list = new ArrayList<Status>();
}
public void add(Status status) {
this.list.add(status);
}
public String getStatusContentForIndex(Integer i) {
return this.list.get(i).getStatus();
}
}
測試
public class DoMain {
public static void main(String[] args) {
StatusWarehouse sw = new StatusWarehouse();
Handle h = new Handle();
h.setStatus("1");
sw.add(h.createStatusObj());
h.setStatus("2");
sw.add(h.createStatusObj());
System.out.println(sw.getStatusContentForIndex(0));
System.out.println(sw.getStatusContentForIndex(1));
}
}
狀態模式
*** 意圖:允許對象在內部狀態發生改變時改變它的行爲,對象看起來好像修改了它的類。 ***
定義狀態
public interface Status {
void setStatus(StatusMap status);
}
具體化狀態
public class DoSomethingStatus implements Status{
public DoSomethingStatus() {}
@Override
public void setStatus(StatusMap sMap) {
this.doSomething();
sMap.setStatus(this);
}
private void doSomething() {
System.out.println("do something");
}
public String toString(){
return "1";
}
}
狀態容器
public class StatusMap {
private Status status;
public StatusMap() {}
public void setStatus(Status status) {
this.status = status;
}
public Status getStatus() {
return status;
}
}
調用
public class DoMain {
public static void main(String[] args) {
StatusMap sm = new StatusMap();
DoSomethingStatus dss = new DoSomethingStatus();
dss.setStatus(sm);
System.out.println(sm.getStatus());
}
}
待補充