设计模式

Java装饰者模式

2018-09-20  本文已影响8人  韭菜待收割

1、装饰者模式的定义

装饰者模式是在已有功能的基础之上,动态地添加更多功能的一种方式,这些新加的代码装饰了原有类的核心职责或主要行为。
IO阻塞类中有该使用该场景,动态给一个对象添加一些额外的功能。

2、装饰者模式的优缺点

优点:把类的 核心职责和装饰功能区分开来,结构清晰,可以去除相关类的重复的装饰逻辑,相比用生成子类方式达到功能的扩充显得更为灵活。
缺点:产生了太多的装饰者类,有类爆炸的趋势。

3、如何实现装饰者模式

要点:装饰者与被装饰者拥有共同的超类。

//懒,就写一起了
public class MainTest {
    //测试方法
    public static void main(String[] args) throws Exception {
        People man = new Man();
        Decorator decoratorMan = new DecoratorMan(man);
        //定义一个真男人
        Decorator decoratorXMan = new DecoratorXMan(decoratorMan);
        decoratorXMan.drinking();
        decoratorXMan.driving();
//        **********找到啤酒一箱**********
//        **********喝酒**********
//        **********喝一箱**********
//        **********找到驴车一辆**********
//        **********开车**********
//        **********往城市边缘瞎JB开**********
    }
    //定义被装饰者
    public interface People {
        //喝酒
        void drinking();
        //开车
        void driving();
    }
    //定义被装饰者,被装饰者初始状态有些自己的装饰
    public static class Man implements People {
        @Override
        public void drinking() {
            System.out.println("**********喝酒**********");
        }
        @Override
        public void driving() {
            System.out.println("**********开车**********");
        }
    }
    //定义装饰者
    public abstract static class Decorator implements People {
        private People people;
        public Decorator(People people) {
            this.people = people;
        }
        //喝酒
        public void drinking() {
            people.drinking();
        }
        //开车
        public void driving() {
            people.driving();
        }
    }
    //男人 喝啤酒开驴车
    public static class DecoratorMan extends Decorator{
        public DecoratorMan(People people) {
            super(people);
        }
        public void lookingForWine(){
            System.out.println("**********找到啤酒一箱**********");
        }
        public void lookingForCar(){
            System.out.println("**********找到驴车一辆**********");
        }
        //喝酒
        public void drinking() {
            lookingForWine();
            super.drinking();
        }
        //开车
        public void driving() {
            lookingForCar();
            super.driving();
        }
    }
    //真男人 往城市边缘瞎XX开
    public static class DecoratorXMan extends Decorator{
        public DecoratorXMan(People people) {
            super(people);
        }
        public void howMuch(){
            System.out.println("**********喝一箱**********");
        }
        public void where(){
            System.out.println("**********往城市边缘瞎JB开**********");
        }
        //喝酒
        public void drinking() {
            super.drinking();
            howMuch();
        }
        //开车
        public void driving() {
            super.driving();
            where();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读