1. 程式人生 > >大話設計模式——裝飾模式和代理模式(一)

大話設計模式——裝飾模式和代理模式(一)

區別 接口 需要 構圖 技術分享 開閉 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節中的代碼結構圖如下:

技術分享圖片

個人覺得不妥之處:服飾類繼承了人,沒有遵循裏氏代換原則。

大話設計模式——裝飾模式和代理模式(一)