大话设计模式学习笔记(6)——装饰模式

问题提出

为一个模特穿衣服。要求根据用户的需求能够有不同的装扮。(注意要符合我们的几个原则——依赖倒转,开放闭合,单一职责等)。
穿衣过程暴露在外

class Main {
    public static void main(String args[]) {
        Model model = new Model("模特A");
        Clothes c1 = new Thirts();
        c1.show();
        Clothes c2 = new Pants();
        c2.show();
    }
}
class Model
{
    public Model(String name) {
        System.out.println(name+":");
    }
}
interface Clothes
{
    void show();
}
class Thirts implements Clothes
{
    public void show()
    {
        System.out.println("穿T恤衫");
    }
}
class Pants implements Clothes
{
    public void show()
    {
        System.out.println("穿短裤");
    }
}

结果为:
模特A:
穿T恤衫
穿短裤

写完上面的代码,大家有没有发现一个问题:其实我们的Model类与衣服之间并没有什么联系,而且我们穿衣服的过程是完全暴露在main方法里面的,安全性大大下降。

针对上面代码的问题:我们就需要进行代码的修改。加强模特与服装之间的联系,然后把穿衣过程隐藏起来。
装饰模式


class Main {
    public static void main(String args[]) {
        Model model = new Model("模特A");
        Thirts thirts = new Thirts(model);
        Pants pants = new Pants(thirts);
        pants.show();
    }
}
class Model
{
    String name;
    public Model() {

    }
    public Model(String name) {
        this.name = name;
    }
    void show() {
        System.out.println(name+":");
    }
}
class Thirts extends Model
{
    Model model;
    public Thirts(Model model) {
        this.model = model;
    }
    void show()
    {
        if (model!=null) {
            model.show();
            System.out.println("穿T恤衫");
        }

    }
}
class Pants extends Model
{
    Model model;
    public Pants(Model model) {
        this.model = model;
    }
    void show()
    {
        if (model!=null) {
            model.show();
            System.out.println("穿短裤");
        }

    }
}

装饰模式(Decorator)动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

不知道大家看上面装饰模式的代码是否能看懂:如问题所述,就是给一个模特穿衣服的过程。在每一个衣服类里面保存一个model对象,然后重写model的show()方法,添加自己的独特方法然后再调用model自己的show()方法(目的是把之前装饰过的操作也做一遍)。装饰过程是一步一步来的,添加一个功能就是一个单独的步骤。大家仔细理解一下应该不难。

装饰模式的类图如下:

 * @startuml
 * class Model{
 * Model()
 * show():void
 * }
 * Model<|--Thirts
 * Model<--Thirts
 * class Thirts{
 * Model:model
 * Thirts(model)
 * void show()
 * }
 * Model<|--Pants
 * Model<--Pants
 * class Pants{
 * Model model
 * Pants(model)
 * void show()
 * }
 * @enduml

大话设计模式学习笔记(6)——装饰模式_第1张图片

你可能感兴趣的:(大话设计模式,学习笔记)