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

    装饰模式

    动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的取代方案

    这里写图片描写叙述

    代码

    package gx.component;
    
    /**
     * 组件:装饰类和被装饰类 都要继承:为了类型保持一致
     * @author always
     *
     */
    public abstract class Component {
    
        public abstract void description();
        public abstract int cost();
    }
    
    
    package gx.component.impl;
    
    import gx.component.Component;
    
    
    /**
     * 装饰类的抽象类
     * @author always
     *
     */
    public abstract class  Decorator extends Component{
    
        protected Component component;
    }
    
    package gx.component.impl;
    
    import gx.component.Component;
    
    /**
     * 
     * 被包装的类
     * @author always
     *
     */
    public class Phone extends Component{
    
        public void description() {
            System.out.println("裸机");
        }
    
        public int cost() {
    
            return 1900;
        }
    
    
    }
    
    package gx.decorator.impl;
    
    import gx.component.Component;
    import gx.component.impl.Decorator;
    
    /**
     * 
     * 装饰1:给手机买个壳
     * @author always
     *
     */
    public class DaiKe extends Decorator{
    
        public DaiKe(){
    
        }
    
        public DaiKe(Component component){
            this.component=component;
        }
        public void description() {
            this.component.description();
            System.out.println("带了手机壳");
        }
    
        public int cost() {
            return 50+this.component.cost();
        }
    
    }
    
    package gx.decorator.impl;
    
    import gx.component.Component;
    import gx.component.impl.Decorator;
    
    /**
     * 
     * 装饰2:给手机贴个膜
     * @author always
     *
     */
    public class TieMo extends Decorator{
    
        public TieMo(){}
    
        public TieMo(Component component){
            this.component=component;
        }
    
        public void description() {
            this.component.description();
            System.out.println("贴了膜");
        }
    
        public int cost() {
            return 20+this.component.cost();
        }
    
    }
    
    

    測试类:

    package gx;
    
    import gx.component.Component;
    import gx.component.impl.Phone;
    import gx.decorator.impl.DaiKe;
    import gx.decorator.impl.TieMo;
    import junit.framework.TestCase;
    
    public class TestDecorator extends TestCase {
    
        public void testDecorator() {
    
            Component component = new TieMo(new DaiKe(new Phone()));
    
            component.description();
            System.out.println("价钱:" + component.cost());
            /*
             * 结果:
             *  裸机 
             *  带了手机壳
             *  贴了膜 
             *  价钱:1970
             */
        }
    }
    
  • 相关阅读:
    携程开源框架Apollo基础学习(一)
    nslookup,dig,host的用法详解
    curl命令学习
    Saltstack本地管理无master模式
    Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?
    JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
    #{}和${}的区别是什么?
    为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
    MyBatis 与 Hibernate 有哪些不同?
    MyBatis 的好处是什么?
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5369823.html
Copyright © 2011-2022 走看看