一. 策略模式java
定義:策略模式定義了一系列的算法,並將每個算法封裝起來,並且使它們還能夠相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。算法
先說這個場景中的要素:三個妙計,一個錦囊,一個趙雲。編程
1)妙計:(一個接口,三個具體妙計)app
1 package com.henry.strategy; 2 3 public interface IStrategy { 4 5 public void operate(); 6 7 }
1 package com.henry.strategy; 2 3 public class BackDoor implements IStrategy { 4 5 @Override 6 public void operate() { 7 // TODO Auto-generated method stub 8 System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力"); 9 } 10 11 }
1 package com.henry.strategy; 2 3 public class GivenGreenLight implements IStrategy { 4 5 @Override 6 public void operate() { 7 // TODO Auto-generated method stub 8 System.out.println("求吳國太開個綠燈,放行!"); 9 } 10 11 }
1 package com.henry.strategy; 2 3 public class BlockEnemy implements IStrategy { 4 5 @Override 6 public void operate() { 7 // TODO Auto-generated method stub 8 System.out.println("孫夫人斷後,擋住追兵"); 9 } 10 11 }
2)接下來就是錦囊了,用來放妙計的東東。ide
1 package com.henry.strategy; 2 3 public class Context { 4 5 private IStrategy strategy; 6 7 public Context(IStrategy strategy) { 8 this.strategy = strategy; 9 } 10 11 public void operate() { 12 this.strategy.operate(); 13 } 14 }
3) 最後就是趙子龍登場的時候了。this
1 package com.henry.strategy; 2 3 public class ZhaoYun { 4 5 public static void main(String[] args) { 6 Context context; 7 8 //剛剛到吳國的時候拆第一個 9 System.out.println("-----------剛剛到吳國的時候拆第一個-------------"); 10 context = new Context(new BackDoor()); //拿到妙計 11 context.operate(); //拆開執行 12 System.out.println(""); 13 14 //劉備樂不思蜀了,拆第二個了 15 System.out.println("-----------劉備樂不思蜀了,拆第二個了-------------"); 16 context = new Context(new GivenGreenLight()); 17 context.operate(); //執行了第二個錦囊了 18 System.out.println(""); 19 20 //孫權的小兵追了,咋辦?拆第三個 21 System.out.println("-----------孫權的小兵追了,咋辦?拆第三個-------------"); 22 context = new Context(new BlockEnemy()); 23 context.operate(); //孫夫人退兵 24 System.out.println(""); 25 } 26 27 }
二. 代理模式
定義:爲其餘對象提供一種代理以控制對這個對象的訪問。在某些狀況下,一個對象不適合或者不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用。spa
場景:好比西門慶找潘金蓮,那潘金蓮很差意思答覆呀,咋辦,找那個王婆作代理,表如今程序上時這樣的:
1) 先定義一種類型的女人:3d
1 package com.henry.proxy; 2 3 public interface KindWomen { 4 5 public void makeEyesWithMan(); 6 public void happyWithMan(); 7 8 }
2) 再定一個醜陋的王婆:代理
1 package com.henry.proxy; 2 3 public class WangPo implements KindWomen { 4 5 private KindWomen kindWomen; 6 7 public WangPo() { 8 this.kindWomen = new PanJinLian(); 9 } 10 11 public WangPo(KindWomen kindWomen) { 12 this.kindWomen = kindWomen; 13 } 14 15 @Override 16 public void makeEyesWithMan() { 17 // TODO Auto-generated method stub 18 this.kindWomen.makeEyesWithMan(); 19 } 20 21 @Override 22 public void happyWithMan() { 23 // TODO Auto-generated method stub 24 this.kindWomen.happyWithMan(); 25 } 26 27 }
3) 兩個女主角都上場了,男主角也該出現了:code
1 package com.henry.proxy; 2 3 public class XiMenQing { 4 5 public static void main(String[] args) { 6 WangPo wangPo = new WangPo(); 7 8 wangPo.makeEyesWithMan(); 9 wangPo.happyWithMan(); 10 } 11 12 }
那這就是活生生的一個例子,經過代理人實現了某種目的,若是真去掉王婆這個中間環節,直接是西
門慶和潘金蓮勾搭,估計很難成就武松殺嫂事件。
那咱們再考慮一下,水滸裏還有沒有這類型的女人?有,盧俊義的老婆賈氏(就是和那個固管家苟合
的那個),這名字起的:「假使」,那咱們也讓王婆作她的代理:
4)把賈氏素描出來:
1 package com.henry.proxy; 2 3 public class JiaShi implements KindWomen { 4 5 @Override 6 public void makeEyesWithMan() { 7 // TODO Auto-generated method stub 8 System.out.println("賈氏拋媚眼"); 9 } 10 11 @Override 12 public void happyWithMan() { 13 // TODO Auto-generated method stub 14 System.out.println("賈氏正在happy中......"); 15 } 16 17 }
5) 西門慶勾賈氏:
1 package com.henry.proxy; 2 3 public class XiMenQing2 { 4 5 public static void main(String[] args) { 6 JiaShi jiaShi = new JiaShi(); 7 WangPo wangPo = new WangPo(jiaShi); 8 9 wangPo.makeEyesWithMan(); 10 wangPo.happyWithMan(); 11 } 12 13 }
三. 單例模式
1 package com.henry.singleton; 2 3 public class Emperor { 4 private static Emperor emperor = null; 5 6 private Emperor() { 7 } 8 9 public static Emperor getInstance() { 10 if(emperor == null) { 11 emperor = new Emperor(); 12 } 13 return emperor; 14 } 15 16 public static void emperorInfo(){ 17 System.out.println("我就是皇帝asdasdsdssd"); 18 } 19 }
1 package com.henry.singleton; 2 3 public class Minister { 4 public static void main(String[] args) { 5 //First Day 6 Emperor emperor1 = Emperor.getInstance(); 7 emperor1.emperorInfo(); 8 9 //Second day 10 Emperor emperor2 = Emperor.getInstance(); 11 emperor2.emperorInfo(); 12 13 //Third day 14 Emperor emperor3 = Emperor.getInstance(); 15 emperor3.emperorInfo(); 16 } 17 }