美文网首页设计模式
Java装饰者模式

Java装饰者模式

作者: 韭菜待收割 | 来源:发表于2018-09-20 18:15 被阅读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();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Java装饰者模式

        本文链接:https://www.haomeiwen.com/subject/eminnftx.html