Java设计模式之装饰模式

Java23种设计模式

装饰模式是不改变原来对象的基础上对原对象的拓展。

  • 装饰模式修饰过的对象,本体不变,只对功能进行拓展。
  • 一般来说,对象被多次装饰之后,只保留最后一次的装饰属性(否则不如用继承)。
需求:孙悟空七十二变,孙悟空本身是猴子,可以变成鸟和鱼。变身之后他拥有了鱼和鸟的属性,鱼和鸟的属性只是对猴属性的一种装饰,但是他本身依然是猴子而不是鱼或者鸟。
  1. 创建美猴王接口,里面有变化的方法。
public interface MonkeyKing {
    void change();
}
  1. 创建猴子类,这个类是最基本的对象,因为孙悟空就是猴子。
public class Monkey implements MonkeyKing{
    @Override
    public void change() {
        System.out.print("本体是猴子!\n");
    }
}
  1. 创建装饰类鸟和鱼,里面一方面保持了猴子原本的属性,另一方面拥有鸟和鱼特有的属性。
public class Bird implements MonkeyKing{
    private MonkeyKing monkeyKing;

    public Bird(MonkeyKing monkeyKing) {
        this.monkeyKing = monkeyKing;
    }

    @Override
    public void change() {
        monkeyKing.change();
        System.out.print("变成一只小小鸟!\n");
    }

    public void fly(){
        System.out.print("可以飞翔了!\n");
    }
}
public class Fish implements MonkeyKing{
    private MonkeyKing monkeyKing;

    public Fish(MonkeyKing monkeyKing) {
        this.monkeyKing = monkeyKing;
    }
    @Override
    public void change() {
        monkeyKing.change();
        System.out.print("变成一只小鱼!\n");
    }

    public void swim(){
        System.out.print("可以游泳了!\n");
    }
}
  1. 创建test测试类,让孙悟空分别变化鸟和鱼,然后看本事的变化。
public class Test {
    public static void main(String[] args) {
        Monkey monkey = new Monkey();
        Bird bird = new Bird(monkey);
        Fish fish = new Fish(bird);
        System.out.print("============\n变猴子!\n");
        monkey.change();
        System.out.print("============\n变傻鸟!\n");
        bird.change();
        bird.fly();
        System.out.print("============\n变鲸鱼!\n");
        fish.change();
        fish.swim();
    }
}

打印结果

============
变猴子!
本体是猴子!
============
变傻鸟!
本体是猴子!
变成一只小小鸟!
可以飞翔了!
============
变鲸鱼!
本体是猴子!
变成一只小小鸟!
变成一只小鱼!
可以游泳了!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值