简易的装饰者模式

简述:在不继承、重构一个类的情况,为这个类定义一个包装的类,修改原类的方法实现。

在装饰模式中的各个角色有(借鉴):
  (1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
  (2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
  (3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
  (4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

定义一个抽象的构建People,定义公共的接口方法eat():

package demo1;

/**
 * 时间: 2018/3/27.
 *
 * @author zwf
 */
public interface People {
    public abstract void eat();
}

定义具体类的构建Persion,实现接口eat():

package demo1;

/**
 * 时间: 2018/3/27.
 *
 * @author zwf
 */
public class Person implements People{

    @Override
    public void eat() {
        System.out.println("1个人");
    }
}

定义装饰角色,这边的角色主要的People的定义,一定要定义这个接口类型的对象。这边可以用构造方法实现类对象的赋值,

也可以使用set方法进行赋值。带参数的构造时,子类也需要重写构造方法,测试代码时,可以用new 类(角色)创建,代码简单;这边是使用set方法,更加灵活点。

这边需要定义这个对象,就是装饰者模式对这个类进行装饰,重写了类的方法体实现。代码实现:

package demo1;

/**
 * 时间: 2018/3/27.
 *
 * @author zwf
 */
public abstract class DecoratorAll implements People{
    private People people;

    public DecoratorAll() {
    }

    public DecoratorAll(People people) {
        this.people = people;
    }
    public void setPeople(People people){
        this.people = people;
    }

    @Override
    public void eat() {
        people.eat();
    }
}
义具体的装饰者角色:
package demo1;

/**
 * 时间: 2018/3/27.
 *
 * @author zwf
 */
public class Decorator1 extends DecoratorAll{


    @Override
    public void eat() {
        super.eat();
        System.out.println("吃了中饭");
    }
}

解释super.eat(),个人理解:

扫描二维码关注公众号,回复: 933430 查看本文章

调用,则是实现了装饰器对原类eat()方法的扩展。

不调用,则是装饰器对原类方法的重写(不等同继承中的重写)。

测试代码:

package demo1;

/**
 * 时间: 2018/3/27.
 *
 * @author zwf
 */
public class TestMain {
    public static void main(String[] args) {
        Person person = new Person();
        Decorator1 decorator1 = new Decorator1();
        decorator1.setPeople(person);
        decorator1.eat();
    }
}
运行结果:
1个人
吃了中饭

感想:这个装饰者模式在Java的源码IO中很常见,个人实践的也很少,代码写的也不多,只能死记硬背,但是又没有具体在项目中使用到这种模式,很遗憾。








猜你喜欢

转载自blog.csdn.net/qq_36633149/article/details/79712387
今日推荐