23種設計模式:03裝飾模式

Bonjour~Bridge發表於2020-09-24

最近寫這些部落格的目的也是幫自己梳理一下之前學習的知識,並希望的到新的感悟,放入部落格之中,最近的感悟是,我們需要重點理解設計模的幾個原則,然後各個模式是用於解決不同的場景的需求,而具體場景下,我們不必拘泥於模式的格式是否正確,否則這就違背了模式的初衷,我們應該將能獨立的分析自己的需求和要達到的目的,然後可以借鑑各個模式的解決方案

應用場景

對實體類“人”的職能的“任意”擴充套件

當我們希望對人的職能進行擴充套件,而具體的擴充套件的功能我們希望再不同的需求場景下是可以裝配的,而不是一層不變的,比如“張三”可以開車、穿西裝、吸菸等等,而“李四”可以騎摩托車、留鬍子、喝酒等等,此時的開車、穿西裝、吸菸、騎摩托、留鬍子等等,就是對人這個實體類的擴充套件職能。

UML實體類

在這裡插入圖片描述

程式碼

  • 實體類,Person
class Person{
    private String name;
    private int age;
    public Person(){}
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println("大家好,我是" + this.name + "今年" + this.age);

    }
}
  • 下面我們希望對Person的進行擴,這裡我選擇依賴關係 Decorator類
class Decorator{


    private Person person;
    private Decorator decorator;

    public Decorator(Person person){
        this.person = person;
    }
    public Decorator(){
    }
    public void  decorator(Decorator decorator){
        this.decorator = decorator;
    }

    void doDressUp(){
        person.show();
    };
}
  • 接下來就是裝飾類的具體職能了,比如“開車”、“喝酒”、“騎摩托”、“抽菸”等等
class Smoking extends Decorator{

    private Decorator decorator;

    public void  decorator(Decorator decorator){
        this.decorator = decorator;
    }

    @Override
    public void doDressUp() {
        decorator.doDressUp();
        System.out.println("吸菸");
    }
}

class Drinking extends Decorator{

    private Decorator decorator;

    public void  decorator(Decorator decorator){
        this.decorator = decorator;
    }

    @Override
    public void doDressUp() {
        decorator.doDressUp();
        System.out.println("喝酒");
    }
}

class Driving extends Decorator{

    private Decorator decorator;

    public void  decorator(Decorator decorator){
        this.decorator = decorator;
    }

    @Override
    public void doDressUp() {
        decorator.doDressUp();
        System.out.println("喝酒");
    }
}

class Ride extends Decorator{

    private Decorator decorator;

    public void  decorator(Decorator decorator){
        this.decorator = decorator;
    }

    @Override
    public void doDressUp() {
        decorator.doDressUp();
        System.out.println("騎摩托");
    }
}
  • 呼叫方式如下,模擬了“張三”和“李四”
        Person person = new Person("張三",32);
        Decorator decorator = new Decorator(person);
        Driving driving = new Driving();
        Smoking smoking = new Smoking();
        driving.decorator(decorator);
        smoking.decorator(driving);
        smoking.doDressUp();

        Person person01 = new Person("李四",22);
        Decorator decorator01 = new Decorator(person01);
        Drinking drinking = new Drinking();
        Ride ride = new Ride();
        drinking.decorator(decorator01);
        ride.decorator(drinking);
        ride.doDressUp();

總結

  • 如果我們希望對某個類進行職能或者功能的擴充套件,而且我們希望這些功能可以隨著業務的不同,任意的擴充套件,就可以考慮裝飾模式
  • 裝飾模式,person和Decorator採用依賴的關係,而沒有采用繼承,我是希望降低person和Decorator的耦合度,如果Person有修改,不會影響Decorator的業務。並且Decorator職能不會太大。

相關文章