装饰者模式

装饰者模式简介:

装饰者模式: 动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的代替方案。(因为装饰者模式使用的是组合的方式提供了扩展而不是使用继承从而可以保证 在任何适合都可以 进行扩展。)


装饰者模式的类图:





装饰者模式的一些特征:

1. 装饰者和被装饰者有着共同的超类

2.我们可以使用多个装饰者去装饰同一个对象


例子:


  我们去饭店吃饭,有 食物米饭 ,菜 有鸡肉、鸭肉、猪肉、青菜 等等,我们可以可以选择 食物和菜的任意组合



抽象构件角色(food): 给出一个接口,以规范准备接收附加责任的对象
具体构件角色(rice): 定义一个将要接收附加责任的类
装饰角色(foodDecorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(Duck、Chicken):负责给构件对象“贴上”附加的责任
food :给出一个接口,规范了使用的接口信息

public interface Food {
    public  void eat();
}

rice :具体构建角色,给出了需要附加 其他行为的类

public class Rice implements Food  {
    @Override
    public void eat() {
        System.out.println("吃米饭");
    }
}
public abstract class FoodDecorator implements Food {

    public abstract void eat();
}

具体装饰角色

public class Duck extends FoodDecorator {
    Food food;
    public Duck(Food food){
        this.food = food;
    }
    @Override
    public void eat() {
        System.out.print("吃鸭肉\t");
        food.eat();
    }
}

public class Chicken extends FoodDecorator {
    Food food;

    public Chicken(Food food) {
        this.food = food;
    }

    @Override
    public void eat() {
        System.out.print("吃鸡肉\t");
        food.eat();
    }
}
测试类:

public class Test {
    public static void main(String[] args) {
        Food rice = new Rice();
        //吃米饭
        rice.eat();
        split();

        Food duck = new Duck(rice);
        //吃鸭肉 米饭
        duck.eat();
        split();

        Food chicken = new Chicken(rice);
        //吃鸡肉 米饭
        chicken.eat();
        split();

        Food chickenAndDuck = new Chicken(duck);
        // 吃鸡肉 鸭肉 米饭
        chickenAndDuck.eat();
        split();
    }

    private static void split() {
        System.out.println("----------------");
    }
}

执行结果:

吃米饭
----------------
吃鸭肉 吃米饭
----------------
吃鸡肉 吃米饭
----------------
吃鸡肉 吃鸭肉 吃米饭
----------------


Process finished with exit code 0













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值