初学《大话设计模式》——装饰模式

一、概念

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

二、使用场景

当需要向已有功能动态地添加更多功能,或者当系统需要新功能的时候,是向旧类中添加新的代码,这些新的代码通常装饰了原有类的核心职责或主要行为。装饰着模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的、按顺序地使用装饰功能包装对象。

三、代码示例

程序共有7个类
这里写图片描述

Person.java

package decorator;

public class Person {

    public Person() {

    }

    private String name;

    public Person(String name) {
        super();
        this.name = name;
    }

    public void Show() {
        System.out.println("装饰的"+name );
    }

}

Finery.java

package decorator;

public class Finery extends Person{

    protected Person component;

    //打扮
    public void Decorator(Person component) {
        this.component=component;
    }

    @Override
    public void Show() {
        if (component!=null) {
            component.Show();
        }
    }
}

BigTrouser.java

package decorator;

public class BigTrouser extends Finery{

    @Override
    public void Show() {
        System.out.println("垮裤");
        super.Show();
    }
}

LeaderShoes.java

package decorator;

public class LeaderShoes extends Finery{

    @Override
    public void Show() {
        System.out.println("皮鞋");
        super.Show();
    }
}

Sneakers.java

package decorator;

public class Sneakers extends Finery{

    @Override
    public void Show() {
        System.out.println("球鞋");
        super.Show();
    }
}

Tshirs.java

package decorator;

public class Tshirs extends Finery{

    @Override
    public void Show() {
        System.out.println("大T恤");
        super.Show();
    }
}

Main.java

package decorator;

import org.junit.Test;

public class Main {

    @Test
    public void test() {
        Person person=new Person("小菜");

        System.out.println("\n第一种装扮:");
        Sneakers sneakers=new Sneakers();
        BigTrouser bigTrouser=new BigTrouser();
        Tshirs tshirs=new Tshirs();

        sneakers.Decorator(person);
        bigTrouser.Decorator(sneakers);
        tshirs.Decorator(bigTrouser);
        tshirs.Show();

        System.out.println("\n第二种装扮:");
        Tshirs tshirs2=new Tshirs();
        LeaderShoes leaderShoes=new LeaderShoes();
        Sneakers sneakers2=new Sneakers();
        tshirs2.Decorator(person);
        leaderShoes.Decorator(tshirs2);
        sneakers2.Decorator(leaderShoes);
        sneakers2.Show();


    }
}

四、代码效果展示

第一种装扮:
大T恤
垮裤
球鞋
装饰的小菜

第二种装扮:
球鞋
皮鞋
大T恤
装饰的小菜

五、优点

装饰模式的有点就是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类,这样做更大的好处在于,有效地把类的核心职责和装饰功能区分开,而且可以去除相关类重复的装饰逻辑

猜你喜欢

转载自blog.csdn.net/kooking_l/article/details/80225112
今日推荐