• 设计模式-装饰模式(Decorator Pattern)


    装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

    特点

    1. 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
    2. 装饰对象包含一个真实对象的引用(reference)
    3. 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
    4. 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

    优点:

    1. 装饰模式和继承都是为了扩展类的功能,但是装饰模式更加的灵活

    缺点:

    1. 比继承灵活,但是增加了复杂性
    2. 比继承多了装饰类

    示例:

    接口 Waiter,有一个 service 方法

    public interface Waiter {
    
        void service();
    }

    实现类 Waiterress,实现了 Waiter 接口,并实现了 service 方法

    public class Waiterress implements Waiter {
        @Override
        public void service() {
            System.out.println("服务...");
        }
    }

    这个时候,需要 Waiterress 的方法 service 提供更多的内容,可以通过继承实现,也可以通过装饰模式实现。

    继承实现:

    public class MoreWaiterress extends Waiterress {
    
        @Override
        public void service() {
            System.out.println("更多的内容...");
            super.service();
        }
    }

    装饰模式:

    public class WaitWrap implements Waiter {
        Waiter waiter;
        public WaitWrap(Waiter waiter){
            this.waiter = waiter;
        }
    
        @Override
        public void service() {
            System.out.println("微笑...");
            waiter.service();
        }
    }

    在装饰模式中,service 方法可以试下更多的内容,或者屏蔽到以前的 service 方法,只实现想要的功能。

    测试:

    public class TestWapper {
        /**
         * 装饰模式
         * 1. 实现相同的接口
         * 2. 传入需要被装饰的对象
         * 3. 调用装饰的接口的方法
         */
        public static void main(String[] args) {
    //        Waiter waiter = new Waiterress();
    //        waiter.service();
            Waiter waiter = new WaitWrap(new Waiterress());
            waiter.service();
        }
    }

    在实际开发中,都是面向接口编程,是无法看到具体的实现类的,这个时候,就无法通过继承实现类进行扩展功能了,这个时候可以通过装饰模式来实现扩展,实现更多的功能。

  • 相关阅读:
    php......房屋租赁练习
    php......调研投票练习
    数据访问......单条件查询与多条件查询
    数据访问......简单练习
    数据访问......增删改查
    数据访问
    面向对象练习
    php正则表达式和数组
    php面向对象加载类
    php类和对象(二)
  • 原文地址:https://www.cnblogs.com/liyiran/p/6482728.html
Copyright © 2020-2023  润新知