大話設計模式——裝飾模式和代理模式(一)
阿新 • • 發佈:2018-10-18
區別 接口 需要 構圖 技術分享 開閉 tro 可能 code
1、是什麽?
裝飾模式:動態地給一個對象添加額外的職責。
代理模式:其他對象通過對象A去訪問對象B。
2、為什麽用?
裝飾模式:1、遵循開閉原則,盡量不去修改原有的類。2、裝飾對象一般都是添加額外的非核心功能,通過繼承來擴展也可以達到目的,不過無法靈活的組合這些新添的功能。
代理模式:假如一個對象A有很多方法,但是對於某些對象只允許訪問A中一部分方法,這就需要通過代理對象進行訪問,這就是所謂的權限。==
3、怎麽用?
裝飾模式:
public class task_02_裝飾模式 { @Test public void test() { Client client=new Client(); RealPerson person1=new RealPerson("小強"); client.fun(person1); BasePerson person2=new Decorator1(person1); client.fun(person2); BasePerson person3=new Decorator2(person1); client.fun(person3); } } class Client{public void fun(BasePerson person) { person.play(); } } /** * 對象接口,對其play方法進行裝飾 * @author xiang20180825 * */ interface BasePerson{ void play(); } /** * 具體對象 * @author xiang20180825 * */ class RealPerson implements BasePerson{ private String name; RealPerson(String name){this.name=name; } public void play() { System.out.println(name+"打籃球"); } } /** * 裝飾抽象類 * @author xiang20180825 * */ abstract class Decorator implements BasePerson{ BasePerson person;//包裝了對象 Decorator(BasePerson person){ this.person=person; } public abstract void play(); } class Decorator1 extends Decorator{ Decorator1(BasePerson person){ super(person); } public void play() { System.out.print("沒有穿衣服的"); person.play(); } } class Decorator2 extends Decorator{ Decorator2(BasePerson person){ super(person); } public void play() { System.out.print("穿了衣服的"); person.play(); } }
代理模式:
/* * 老板的親戚來了,讓老板給他買個早飯,老板買了。 * 實際上是讓助理買的,老板的親戚根本都不知道助理的存在,也不可能讓助理跳舞。 * * 這裏boss相當於代理類。而assistant是實際的買早點的對象。 */ public class task_01_代理模式 { @Test public void test() { Assistant assistant=new Assistant(); Boss boss=new Boss(assistant); goShopping(boss); } public void goShopping(GoShopping goShopping) { goShopping.shopping(); } } interface GoShopping{ void shopping(); } class Assistant implements GoShopping{ public void shopping() { System.out.println("買個早點"); } public void dancing() { System.out.println("跳舞"); } } class Boss implements GoShopping{ Assistant assistant; Boss(Assistant assistant){ this.assistant=assistant; } public void shopping() { assistant.shopping(); } }
區別:(接受批評和指正)
1、側重點不同:裝飾模式強調給對象添加額外的“裝飾”,被裝飾對象原本的功能正常執行;代理模式強調訪問對象的間接性(對實際對象的訪問進行控制)。
2、對於調用者來說,裝飾模式關註被裝飾的對象,效果是被裝飾的功能;代理模式關註訪問實際對象的代理對象,不必知道實際對象的存在,效果是實際對象的功能。
註:
大話設計模式6.5節中的代碼結構圖如下:
個人覺得不妥之處:服飾類繼承了人,沒有遵循裏氏代換原則。
大話設計模式——裝飾模式和代理模式(一)