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

    装饰器模式首先让人想到装修。我们用房子的装修来说明这个模式。首先,要装修需要有个房子。我们把各种房子抽象出一个“房子”这么一个抽象的概念,它有一个抽象的方法就是装修。具体房子就有商店,饭馆,公寓等。装饰器就是装修公司,他们都是针对房子装修,所以会关联房子。具体的装修公司有卫浴装修公司,地板装修公司,家具装修公司等。这些就构成整个装饰模式。

    对于外部调用,首先得有个具体的房子,然后对这个房子做各种装修。比如,先构建一个饭馆,然后对他首先进行卫浴装修,再装地板,再装家具。也可以先装地板,家具,再进行卫浴。这就是装饰模式的有点之一:装饰类(装修公司)和被装饰类(房子)可以独立发展,不会相互耦合。另外,还可以动态扩展类。比如,我们新加入一个粉刷墙壁的公司。直接就可以再对房子进行粉刷装修,而不需要改变已经类。同理也可以动态的撤销一个类(比如去掉地板装修公司)。装饰模式是继承的一个替代模式。

     

    代码如下:

    interface House {
    
        public void decorate();
    }
    
    class Resteraunt implements House {
    
        @Override
        public void decorate() {
            System.out.print("对饭店装修:");
        }
    
    }
    
    class Apartment implements House {
    
        @Override
        public void decorate() {
            System.out.print("对公寓装修:");
        }
    
    }
    
    class Company implements House {
        House house;
    
        public Company(House house) {
            this.house = house;
        }
    
        @Override
        public void decorate() {
            house.decorate();
        }
    
    }
    
    class FloorCompany extends Company {
    
        public FloorCompany(House house) {
            super(house);
        }
    
        @Override
        public void decorate() {
            super.decorate();
            System.out.print("装修地板,");
        }
    }
    
    class KitchenCompany extends Company {
    
        public KitchenCompany(House house) {
            super(house);
        }
    
        @Override
        public void decorate() {
            super.decorate();
            System.out.print("装修厨房,");
        }
    }
    
    class BrushCompany extends Company {
    
        public BrushCompany(House house) {
            super(house);
        }
    
        @Override
        public void decorate() {
            super.decorate();
            System.out.print("刷墙,");
        }
    }
    
    class A{
        A(int i){
            
        }
    }
    class B extends A{
        B(int i){
        super(i);    
        }
    }
    public class MainClass {
         public static void main(String[] args) {
                // 第一种写法
    //            House house = new Resteraunt();
    //            House brush = new BrushCompany(house);
    //            House kitchen = new KitchenCompany(brush);
    //            House floor = new FloorCompany(kitchen);
    //             floor.decorate(); 
                // 第二种写法
                House house = new BrushCompany(new KitchenCompany( new FloorCompany(new Resteraunt())));
                house.decorate(); 
                System.out.print("房屋装修好了!");
                
            }
    }

    执行后输出:

    对饭店装修:装修地板,装修厨房,刷墙,房屋装修好了!

  • 相关阅读:
    题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
    冒泡排序、插入排序、快速排序
    去掉字符串中重复的字符
    建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
    day_1 练习2
    python-day 练习1
    python课程第一天笔记-la
    初学react,为什么页面不显示
    跟我一起学写插件开发
    网上下载的带特效的jquery插件怎么用
  • 原文地址:https://www.cnblogs.com/bigben0123/p/7777039.html
Copyright © 2011-2022 走看看