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有类似的“穿裤子”、“戴帽子”功能,就需要更多的子类来处理。这样子类的数量就非常多了。

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

  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/jwen1994/p/9995057.html
Copyright © 2011-2022 走看看