装饰器模式

装饰器模式,是一种继承的替代解决方案。原本的父类为被装饰者,子类为装饰后的结果:
顶级接口Animal包含一个展示自身行为的方法:


public interface Animal {

    void show();

}

具有共有行为的具体的实现类,RunAnimal:


public class RunAnimal implements Animal{


    public void run() {
        System.out.println("run-->>>");

    }

    @Override
    public void show() {
        this.run();
    }


}

装饰者类:DecorateAnimal,也实现Animal接口,并拥有一个Animal的引用:


public abstract class DecorateAnimal implements Animal{

    private Animal animal;

    public DecorateAnimal(Animal animal) {
        super();
        this.setAnimal(animal);
    }


    public abstract void show();


    public Animal getAnimal() {
        return animal;
    }


    public void setAnimal(Animal animal) {
        this.animal = animal;
    }
}

其它的动物要增加除Run的行为,需要继承装饰者DecorateAnimal再增加行为,如小鸟增加飞的行为:


public class BirdAnimal extends DecorateAnimal{

    public BirdAnimal(Animal animal) {
        super(animal);
    }

    public void fly() {
        System.out.println("fly--->>>>");
    }

    public void show() {
        getAnimal().show();
        this.fly();
    }

}

这个时候我们要让小鸟即有fly和run的行为,继承的方式下,我们只需继承RunAnimal再增加行为,而装饰器模式下则是:


public class MainClass {

    public static void main(String[] args) {

        Animal animal=new RunAnimal();
        BirdAnimal birdAnimal = new BirdAnimal(animal);
        birdAnimal.show();
    }

}

输出结果:

run-->>>
fly--->>>>

当鸭子DuckAnimal要有run,fly,swim的行为时,继承的方式则是,DuckAnimal继承BirdAnimal继承RunAnimal.而装饰器模式下,DuckAnimal还是依旧继承DecorateAnimal,再DuckAnimal中添加swim的行为即可:


public class DuckAnimal extends DecorateAnimal{

    public DuckAnimal(Animal animal) {
        super(animal);
    }

    public void swim() {
        System.out.println("swim-->>");
    }

    @Override
    public void show() {
        getAnimal().show();
        this.swim();
    }
}

然后调用:


public class MainClass {

    public static void main(String[] args) {

        Animal animal=new RunAnimal();
        //先装饰RunAnimal的行为
        BirdAnimal birdAnimal = new BirdAnimal(animal);
        //再装饰BirdAnimal的行为
        DuckAnimal duckAnimal=new DuckAnimal(birdAnimal);
        duckAnimal.show();
    }

}

结果为:

run-->>>
fly--->>>>
swim-->>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值