【黑马程序员济南中心】装饰者设计模式

前言:

       什么是装饰者模式:

                     在不改变原类和继承的情况下动态的扩展对象的功能.通过包装一个对象(类)来实现一个新的具有原来对象相同接口的对象(类).

装饰者模式的特点:

1.    在不改变原有对象的原本的结构上进行功能的添加.

2.    装饰对象和原对象都实现了相同的接口.可以使用于原有对象的方式使用装饰对象.

3.    装饰对象中包含原有对象.即装饰对象是真的的原始对象经过包装之后的对象.

使用环境:

1.    在不影响其他对象的情况下.以动态.透明的方式给单个对象题添加职责.

2.    处理那些可以撤销的职责.

3.    当不您呢个采用生成子类的方法进行扩充的时.一种情况是可能大量独立的扩展.为支持每一种扩展将产生大量的之类.使得之类的数量呈爆炸性增长.另一中情况是因为定义的类被隐藏.或是不能用于生成子类.

参与者:

1.    被装饰的对象基类.

2.    被装饰的对象.

3.    装饰者抽象类

4.    具体的装饰者

代码:

// 基类 接口或者是抽象类  会被 被原始对象或是装饰对象继承或是实现

public interface Person {

    void eat();

}

// 原始对象  实现基类的接口

public class Man implements Person {

    public void eat() {

        System.out.println("男人在吃");

    }

}

// 装饰者的抽象类 实现基类接口

public abstract class Decorator implements Person {

    protected Person person;

    public void setPerson(Person person) {

        this.person = person;

    }

    public void eat() {

        person.eat();

    }

}

//装饰者 继承装饰者的抽象类.而抽象类实现了基类接口那么 此类中也相当于继承了 基类中的方法

public class ManDecoratorA extends Decorator {

    public void eat() {

        super.eat();

        reEat();

        System.out.println("ManDecoratorA类");

    }

    public void reEat() {

        System.out.println("再吃一顿饭");

    }

}


public class extends Decorator {

    public void eat() {

        super.eat();

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

        System.out.println("ManDecoratorB类");

    }

}

// 测试类

public class Test {

    public static void main(String[] args) {

        Man man = new Man();

        ManDecoratorA md1 = new ManDecoratorA();

        ManDecoratorB md2 = new ManDecoratorB();


        md1.setPerson(man);

        md2.setPerson(md1);

        md2.eat();

    }

}

总结: 动态的将功能附加到对象上.想要扩展功能.装饰者是有别于继承的另一种选择.

你可能感兴趣的:(【黑马程序员济南中心】装饰者设计模式)