美文网首页
设计模式-装饰模式

设计模式-装饰模式

作者: Archer_J | 来源:发表于2022-01-18 13:54 被阅读0次
    /**
     * 装饰模式:
     * 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类对象(继承)更为灵活。装饰模式一种对象结构模式。
     * 通常会定义一个抽象的装饰类,然后将具体的装饰类作为他的子类,然后继承具体的装饰类。
     * <p>
     * 优点:装饰类和被装饰类可以独立发展,不会相互耦合;对于扩展一个对象的功能,装饰模式比继承更加的灵活,不会导致类的个数急剧增加。
     * 缺点:多层装饰比较复杂。
     * <p>
     * 使用场景:
     * 1、扩展一个类的功能。
     * 2、动态增加功能,动态撤销。
     * <p>
     * 设计原则:
     * 1、多用组合,少用继承。
     * 2、对扩展开放,对修改关闭。
     * <p>
     * android中应用:java中I/O便使用了装饰者模式 (InputStream)
     */
    public class DecorateTest {
    
        public static void main(String[] args) {
            Component shoe = new Nike();
            shoe = new Color(shoe);
            shoe = new Price(shoe);
            shoe = new Size(shoe);
            // print: Nike, 白色, ¥799, 42
            System.out.println(shoe.des());
        }
    }
    
    /**
     * 装饰模式接口
     */
    public interface Component {
    
        String des();
    
    }
    
    /**
     * 被装饰者(一个具体的组件)
     */
    public class Nike implements Component{
    
        @Override
        public String des() {
            return "Nike";
        }
    }
    
    /**
     * 装饰者抽象类
     */
    public abstract class ShoeDecorator implements Component {
    
        protected Component component;
    
        public ShoeDecorator(Component component) {
            this.component = component;
        }
    
    }
    
    **
     * 颜色装饰
     */
    public class Color extends ShoeDecorator {
    
        public Color(Component component) {
            super(component);
        }
    
        @Override
        public String des() {
            return component.des() + ", 白色";
        }
    }
    
    /**
     * 价格装饰
     */
    public class Price extends ShoeDecorator {
    
        public Price(Component component) {
            super(component);
        }
    
        @Override
        public String des() {
            return component.des() + ", ¥799";
        }
    }
    
    /**
     * 鞋码装饰
     */
    public class Size extends ShoeDecorator {
    
        public Size(Component component) {
            super(component);
        }
    
        @Override
        public String des() {
            return component.des() + ", 42";
        }
    }
    

    相关文章

      网友评论

          本文标题:设计模式-装饰模式

          本文链接:https://www.haomeiwen.com/subject/irykhrtx.html