大话设计模式之装饰模式笔记

发布时间 2023-11-01 09:12:18作者: 啄木鸟伍迪

装饰模式的基本结构

classDiagram class Component{ <<interface>> + operation(); } class ConcreateComponent{ + operation(); } class Decrator{ - Component component; + operation(); } class ConcreateDecrator1{ + operation(); } class ConcreateDecrator2{ + operation(); } ConcreateComponent ..|> Component Decrator..|> Component Decrator <|-- ConcreateDecrator1 Decrator <|-- ConcreateDecrator2

以实现不同的穿搭风格为例

classDiagram class client{ main(String[] args) } class ICharacter{ <<interface>> + show(); } class Finery{ - Component component; + operation(); } class Persion{ - String name; + operation(); } class Suit{ + operation(); } class Tie{ + operation(); } Persion ..|> ICharacter Finery..|> ICharacter Finery <|-- Suit Finery <|-- Tie client o-- Persion Tie o-- Persion Suit o-- Persion

个人形象抽象类

public interface ICharacter {

    public void show();

}

人员实体类

public class Person implements ICharacter {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void show() {
        System.out.println("装扮的" + name);

    }

}

装饰类

public class Finery implements ICharacter {

    protected ICharacter component;

    public void decorate(ICharacter component) {
        this.component = component;
    }

    public void show() {
        if (this.component != null) {
            this.component.show();
        }
    }

}

服装类

西装

public class Suit extends Finery {

    public void show() {
        System.out.print(" 西装");
        super.show();
    }

}

领带

public class Tie extends Finery {

    public void show() {
        System.out.print(" 领带");
        super.show();
    }

}

调用

public static void main(String[] args) {

        System.out.println("**********************************************");
        System.out.println("《大话设计模式》代码样例");
        System.out.println();

        Person xc = new Person();
        xc.setName("小菜");
        System.out.println(" 第一种装扮:");

        Tie ld = new Tie(); // 生成领带实例
        ld.decorate(xc); // 领带装饰“有领带装饰的小菜”

        Suit xz = new Suit(); // 生成西装实例
        xz.decorate(ld); // 西装装饰“有领带西装装饰的小菜”

        xz.show(); // 执行形象展示

        
        System.out.println("**********************************************");

    }