java-设计模式(结构型)-【装饰模式】

1.装饰模式(Decorator)

     

        定义:装饰模式就是给一个对象增加一些新的功能,而且是动态的,而且要求装饰对象和被装饰对象实现同一个接口

                装饰对象持有被装饰对象的实例,关系图如下:

      

     应用场景:

         1、需要扩展一个类的功能

         2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

         缺点:产生过多相似的对象,不易排错!

2.Decorate模式图解

3.使用场景

   当对子类进行装饰时或子类需要过多的装饰时,可以将抽象父类分出一个抽象装饰类,

   由抽象装饰类的子类对子类进行装饰。比如给汽车喷涂油漆时。

   (http://itlab.idcquan.com/Java/special/patterns/Index.html

4.代码实现

    新建一个抽象汽车父类:

//抽象父类汽车
public abstract class Car {
	
	/*
	 * 抽象父类汽车的基本信息:
	 * 生产地址,颜色,速度。
	 * 汽车名由子类名决定,无需定义
	 * */
    public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public float getSpeed() {
		return speed;
	}
	public void setSpeed(float speed) {
		this.speed = speed;
	}
	private String Color;
	public String getColor() {
		return Color;
	}
	public void setColor(String color) {
		Color = color;
	}
	private String address;
    private float speed;
    public abstract  void printColor();
}

  然后新建一个奥迪汽车子类:

public class Audi extends Car {
    /*
     * 汽车子类奥迪
     * 在构造奥迪汽车时就配置相关的信息
     * */
	public Audi()
	{
		super.setColor("白色");
	}
	@Override
	public void printColor() {
		// TODO Auto-generated method stub
		System.out.println("奥迪车的颜色:"+super.getColor());
	}
}

  然后再新建一个装饰者父类:

public abstract class Decorate_Car extends Car  {
    /*
     * 抽象装饰父类的两个操作:
     * 1.汽车入厂[setCar方法]
     * 2.获取入厂汽车的信息[c.printColor()方法]
     * */
	protected  Car c=null;
	//装车入厂
	public void setCar(Car c){
		this.c=c;
	}
	//获取入厂车的信息
	 @Override
	public void printColor() {
		//得知入厂车的颜色
	    c.printColor();
	}
}

  然后再新建装饰者子类:红色装饰者类:

public class Decorate_Red_Car extends Decorate_Car{
    /*
     * 对汽车进行相应的装饰
     * */
	
	@Override
	public void printColor() {
		// TODO Auto-generated method stub
		super.printColor();
		this.c.setColor(":红色");
        System.out.println("红色装饰厂对奥迪车喷红色油漆:"+this.c.getColor());
		 
	}
}

  然后再新建装饰者子类:蓝色装饰者类:

public class Decorate_Blue_Car extends Decorate_Car{
	 /*
     * 对汽车进行相应的装饰
     * */
	
	@Override
	public void printColor() {
		// TODO Auto-generated method stub
		super.printColor();
		 this.c.setColor(":蓝色");
	    System.out.println("蓝色装饰厂对奥迪车喷蓝色油漆:"+this.c.getColor());
		 
	}
}

  测试:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Audi audi=new Audi();
        Decorate_Blue_Car b_car=new Decorate_Blue_Car();
        Decorate_Red_Car  r_car=new Decorate_Red_Car();
        //将奥迪车入厂
        b_car.setCar(audi);
        //将装饰奥迪的蓝色装饰子类入厂
        r_car.setCar(b_car);
        //打印颜色
        r_car.printColor();
	}
}

  运行结果:

奥迪车的颜色:白色
蓝色装饰厂对奥迪车喷蓝色油漆::蓝色
红色装饰厂对奥迪车喷红色油漆::红色

  

  

posted @ 2015-04-08 10:41  beyondbycyx  阅读(157)  评论(0编辑  收藏  举报