zoukankan      html  css  js  c++  java
  • 装饰模式

    装饰模式介绍:http://www.runoob.com/design-pattern/decorator-pattern.html

    允许向一个现有的对象添加新的功能,同时又不改变其结构。

    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    我们来看一个简单的案例:一个人穿衣服

    定义一个Person类

    public class Person {
        private String name;
        
        public Person() {
            super();
        }
        
        public Person(String name) {
            super();
            this.name = name;
        }
    
        public void show(){
            System.out.println("我是一个人");
        }
    }

    定义一个TShirts类,继承了Person类

    public class TShirts extends Person {
        private Person  person;
        
        public void decorate(Person  person){
            this.person = person;
        }
        public void show(){
            person.show();
            System.out.println("我穿大T恤");
        }
    }

    定义一个Trouser类,继承了Person类

    public class Trouser extends Person {
        private Person  person;
        
        public void decorate(Person  person){
            this.person = person;
        }
        
        public void show() {
            person.show();
            System.out.println("我穿裤子");
        }
    }

    测试代码

    public class Test {
        public static void main(String[] args) {
            Person p = new Person("张三");
            
            TShirts ts = new TShirts();
            Trouser tr = new Trouser();
            
            ts.decorate(p);
            tr.decorate(ts);
            tr.show();
        }
    }

    输出结果:

    我是一个人
    我穿大T恤
    我穿裤子

    以“一个人穿衣服”为例,Person类没有完成“穿衣服”功能,为了完成“穿T恤”的功能,我们或许会直接在Person类中修改代码,这样以后需要“穿裤子”、“戴帽子”都需要在Person类中修改。如果创建子类来完成“穿T恤”功能,那么“穿裤子”、“戴帽子”都需要创建子类。如果另一个玩具类Toy有类似的“穿裤子”、“戴帽子”功能,就需要更多的子类来处理。这样子类的数量就非常多了。

    一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。所以,装饰模式的应用背景就是在不想增加很多子类的情况下扩展类。

  • 相关阅读:
    android连接wifi模块
    idea 控制台乱码debug
    线程控制
    jvm 垃圾回收
    java 单例模式
    http报头
    java 构造函数 , 参数传递 , lamda表达式
    mysql 杂识
    spring mvc 配置 拦截器不起作用
    spring mvc 每次请求后是否自动销毁线程
  • 原文地址:https://www.cnblogs.com/jwen1994/p/9995057.html
Copyright © 2011-2022 走看看