設計模式:策略、代理、單例

一. 策略模式java

定義:策略模式定義了一系列的算法,並將每個算法封裝起來,並且使它們還能夠相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。算法

 

先說這個場景中的要素:三個妙計,一個錦囊,一個趙雲。編程

1)妙計:(一個接口,三個具體妙計)app

1 package com.henry.strategy;
2 
3 public interface IStrategy {
4     
5     public void operate();
6     
7 }
IStrategy.java
 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 }
BackDoor.java
 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 }
GivenGreenLight.java
 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 }
BlockEnemy.java

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 }
Context.java

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 }
ZhaoYun.java

二. 代理模式
定義:爲其餘對象提供一種代理以控制對這個對象的訪問。在某些狀況下,一個對象不適合或者不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用。spa

 

場景:好比西門慶找潘金蓮,那潘金蓮很差意思答覆呀,咋辦,找那個王婆作代理,表如今程序上時這樣的:
1) 先定義一種類型的女人:3d

1 package com.henry.proxy;
2 
3 public interface KindWomen {
4     
5     public void makeEyesWithMan();
6     public void happyWithMan();
7     
8 }
KindWomen.java

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 }
WangPo.java

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 }
XiMenQing.java

  那這就是活生生的一個例子,經過代理人實現了某種目的,若是真去掉王婆這個中間環節,直接是西
門慶和潘金蓮勾搭,估計很難成就武松殺嫂事件。

  那咱們再考慮一下,水滸裏還有沒有這類型的女人?有,盧俊義的老婆賈氏(就是和那個固管家苟合
的那個),這名字起的:「假使」,那咱們也讓王婆作她的代理:

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 }
JiaShi

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 }
XiMenQing2.java
(1).職責清晰
真實的角色就是實現實際的 業務邏輯,不用關心其餘非本職責的事務,經過後期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。
(2).代理對象能夠在 客戶端和目標對象之間起到中介的做用,這樣起到了的做用和保護了目標對象的做用。
(3).高擴展性

三. 單例模式

 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 }
Emperor.java
 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 }
Minister.java
相關文章
相關標籤/搜索