• 设计模式——装饰模式


           HeadFirst中装饰者模式的定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的的替代方案。

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

         看看大神的详解(就没话说了)http://blog.csdn.net/hguisu/article/details/7531960

         补充一点,装饰模式在Java领域中的应用:

         1.JavaIO中流的设计

         2.Swing中图形界面的构件功能

         3.Servlet和Struts2中request类的设计。

         来模仿一下高淇老师的Demo

        

    package com.wxisme.decorator;
    
    /**
     * 装饰设计模式
     * @author wxisme @gaoqi
     *
     */
    
    //构建角色接口Component
    public interface iCar {
    	void move();
    }
    //具体的构建角色ConcreteComponent
    class Car implements iCar {
    
    	@Override
    	public void move() {
    		System.out.println("行驶在马路上  ");
    	}
    	
    }
    //Decorator装饰角色
    class SuperCar implements iCar {
    	protected  iCar car;
    	
    	public SuperCar(iCar car) {
    		super();
    		this.car = car;
    	}
    	
    	@Override
    	public void move() {
    		car.move();
    	}
    	
    }
    
    //一下是具体的装饰角色ConcreteDecorator
    class FlyCar extends SuperCar {
    
    	public FlyCar(iCar car) {
    		super(car);
    	}
    	public void fly() {
    		System.out.println("汽车在天上飞   ");
    	}
    	public void move() {
    		super.move();
    		fly();
    	}
    }
    
    class WaterCar extends SuperCar {
    
    	public WaterCar(iCar car) {
    		super(car);
    	}
    	
    	public void swim() {
    		System.out.println("汽车在水里游   ");
    	}
    	
    	public void move() {
    		super.move();
    		swim();
    	}
    	
    }
    
    class AICar extends SuperCar {
    
    	public AICar(iCar car) {
    		super(car);
    	}
    	
    	public void autoMove() {
    		System.out.println("汽车在无人驾驶   ");
    	}
    	
    	public void move() {
    		super.move();
    		autoMove();
    	}
    	
    }
    
    package com.wxisme.decorator;
    
    /**
     * 测试装饰模式
     * @author wxisme
     *
     */
    
    public class DemoDecorator {
    
    	public static void main(String[] args) {
    		Car car = new Car();
    		car.move();
    		System.out.println("------------------");
    		//多态
    		SuperCar fcar = new FlyCar(car);
    		fcar.move();
    		System.out.println("------------------");
    		WaterCar wc = new WaterCar(car);
    		wc.move();
    		System.out.println("------------------");
    		WaterCar wc2 = new WaterCar(new FlyCar(new AICar(car)));
    		wc2.move();
    	}
    
    }
    

     运行结果:

    行驶在马路上 
    ------------------
    行驶在马路上 
    汽车在天上飞  
    ------------------
    行驶在马路上 
    汽车在水里游  
    ------------------
    行驶在马路上 
    汽车在无人驾驶  
    汽车在天上飞  
    汽车在水里游  

    ps.装饰模式就这么愉快的学会了,要想用好还要不断地去实践啊。

  • 相关阅读:
    js控制打印 转的
    原生javascript Ajax
    前端页面js与flash交互——js获取flash对象,并传递参数
    物联网技术概要
    socket.io 入门教程
    转载:socket.io 入门
    转载:node.js socket.io
    IIS7 应用程序池设置成 经典 v2.0
    .net 估计要死在你手里了
    彻底的放弃.net
  • 原文地址:https://www.cnblogs.com/wxisme/p/4510852.html
Copyright © 2020-2023  润新知