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

    职责:

    • 动态的为一个对象式增加新的功能。

    • 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

    实现细节

    • Component抽象构件角色:真实对象和装饰对象具有相同的接口,这样,客户端对象式就能够以与真实对象相同的方式同装饰对象交互。

    • ConcreteComlponent具体构件角色(真实角色)

    • Decorator装饰角色:持有一个抽象构件的引用,装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象。这样,就能在真实对象调用前后增加新的功能。

    • ConcreteDecorator具体装饰角色:负责给构件对象增加新的角色

    package designmode.decorator;
    /**
     * 抽象组件
     * @author baiyi
     *
     */
    public interface ICar {
        void move();
    }
    package designmode.decorator;
    /**
     * 真实对象
     * @author baiyi
     *
     */
    public class Car implements ICar{
        @Override
        public void move() {
            System.out.println("陆地上跑!");
        }
    
    }
    package designmode.decorator;
    /**
     * 装饰角色
     * @author baiyi
     *
     */
    public class SuperCar implements ICar{
        protected ICar car;
        public SuperCar(ICar car) {
            this.car = car;
        }
        @Override
        public void move() {
            car.move();
        }
    
    }
    package designmode.decorator;
    public class FlyCar extends SuperCar{
        @Override
        public void move() {
            super.move();
            fly();
        }
        public FlyCar(ICar car) {
            super(car);
        }
        public void fly() {
            System.out.println("增加飞的功能!");
        }
    }
    package designmode.decorator;
    public class WaterCar extends SuperCar{
        @Override
        public void move() {
            super.move();
            swim();
        }
        public WaterCar(ICar car) {
            super(car);
        }
        public void swim() {
            System.out.println("增加在水里游的功能!!");
        }
    
    }
    package designmode.decorator;
    public class AICar extends SuperCar{
        @Override
        public void move() {
            super.move();
            autoRun();
        }
        public AICar(ICar car) {
            super(car);
        }
        public void autoRun() {
            System.out.println("增加自动驾使功能!!");
        }
    
    }
    package designmode.decorator;
    public class Client {
        public static void main(String [] args) {
            Car car = new Car();
            car.move();
    
            System.out.println("----增加飞行功能---");
            FlyCar fly = new FlyCar(car);
            fly.move();
    
            System.out.println("增加水里游功能----");
            WaterCar water = new WaterCar(car);
            water.move();
    
            System.out.println("增加两种功能----");
            WaterCar wt = new WaterCar(new FlyCar(car));
            wt.move();
        }
    }

    总结:

    • 装饰模式(Decorator)也叫包装器模式(Wrapper)

    • 装饰模式降低系统的耦合度,可以动态的增加或删除对象式的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类具体装饰类

    装饰模式和桥接模式的区别:

    • 两个模式都是为了解决过多子类对象问题,但他们的诱因不一样,桥接模式是对象自身现有机制沿着多个维度变化,是既有部分不稳定,装饰模式是为了增加新的功能。





  • 相关阅读:
    Educational Codeforces Round 86 (Rated for Div. 2) D. Multiple Testcases
    Educational Codeforces Round 86 (Rated for Div. 2) C. Yet Another Counting Problem
    HDU
    HDU
    HDU
    HDU
    Good Bye 2019 C. Make Good (异或的使用)
    Educational Codeforces Round 78 (Rated for Div. 2) C. Berry Jam
    codeforces 909C. Python Indentation
    codeforces1054 C. Candies Distribution
  • 原文地址:https://www.cnblogs.com/baiyifengyun/p/14407731.html
Copyright © 2011-2022 走看看