e2

滴滴侠,fai抖

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

车类型:

package decorator_mode;

/**
 * 车类型
 * 装饰器中为: 抽象构建角色
 */
public interface ICar {
    
    /**
     * 移动
     */
    void move();
    
}

 

车实现类:

package decorator_mode;

/**
 * 车实现类
 * 装饰器中为: 具体构建角色, 也叫真实对象或被装饰对象
 * 也可以对此类进行扩展, 与装饰器行为互不影响
 */
public class Car implements ICar {
    
    
    /**
     * 移动
     */
    @Override
    public void move() {
        System.out.println("陆地上跑!");
    }
    
}

 

装饰器基类:

package decorator_mode;

/**
 * 装饰器(包装器)基类
 * 同时实现ICar, 是为获得共同的行为, 此处就是移动(move)
 */
public class SuperCar implements ICar {

    
    /**
     * 持有对真实car的引用
     * 子类使用到它, 必须声明protected
     */
    protected ICar car;
    
    
    /**
     * 构造器(传入真实car)
     */
    public SuperCar(ICar car) {
        this.car = car;
    }

    
    /**
     * 移动
     */
    @Override
    public void move() {
        car.move();
    }
    
}

 

飞行装饰器类:

package decorator_mode;

/**
 * 飞行装饰器类
 * 装饰器中为: 具体装饰角色
 */
public class FlySuperCar extends SuperCar {

    
    /**
     * 初始化父类, 使之持有对真实car的引用
     */
    public FlySuperCar(ICar car) {
        super(car);
    }
    
    
    /**
     * 移动(同时能飞行)
     */
    @Override
    public void move() {
        super.move();
        fly();
    }
    
    
    /*
     * 飞行
     */
    private void fly(){
        System.out.println("天上飞!");
    }
    
}

 

水上游装饰器类:

package decorator_mode;

/**
 * 水上游装饰器类
 * 装饰器中为: 具体装饰角色
 */
public class WaterSuperCar extends SuperCar {
    
    
    /**
     * 初始化父类, 使之持有对真实car的引用
     */
    public WaterSuperCar(ICar car) {
        super(car);
    }

    
    /**
     * 移动(同时能水上游)
     */
    @Override
    public void move() {
        super.move();
        swim();
    }
    
    
    /*
     * 水上游
     */
    private void swim(){
        System.out.println("水上游!");
    }
    
}

 

自动跑装饰器类:

package decorator_mode;

/**
 * 自动跑装饰器类
 * 装饰器中为: 具体装饰角色
 */
public class AISuperCar extends SuperCar {

    
    /**
     * 初始化父类, 使之持有对真实car的引用
     */
    public AISuperCar(ICar car) {
        super(car);
    }
    
    
    /**
     * 移动(同时能自动跑)
     */
    @Override
    public void move() {
        super.move();
        autoMove();
    }
    
    
    /*
     * 自动跑
     */
    private void autoMove(){
        System.out.println("自动跑!");
    }
    
}

 

测试类:

package decorator_mode;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

public class Client {

    public static void main(String[] args) throws IOException {
        Car car = new Car();
        car.move();//真实car, 真实角色
        
        System.out.println("增加新的功能: 飞行-----------------");
        FlySuperCar flySuperCar = new FlySuperCar(car);
        flySuperCar.move();
        
        System.out.println("增加新的功能: 水里游-----------------");
        WaterSuperCar waterSuperCar = new WaterSuperCar(car);
        waterSuperCar.move();
        
        System.out.println("增加两个新的功能: 飞行, 水里游-----------------");
        WaterSuperCar waterSuperCar2 = new WaterSuperCar(new FlySuperCar(car));//可以陆地上跑!天上飞!水上游!
        waterSuperCar2.move();
        
        
        //Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/a.txt"))));
        //FileInputStream 是真实的对象, 拥有文件输入流功能
        //InputStreamReader 和 BufferedReader 是具体装饰器, 拥有文件输入流功能(同时有读输入流和读并缓存)
    }
    
}

 

执行结果:

陆地上跑!
增加新的功能: 飞行-----------------
陆地上跑!
天上飞!
增加新的功能: 水里游-----------------
陆地上跑!
水上游!
增加两个新的功能: 飞行, 水里游-----------------
陆地上跑!
天上飞!
水上游!

 

 

谢谢声明出处!

转自: http://www.cnblogs.com/gscq073240/articles/7112720.html

 

posted on 2017-07-03 19:28  纯黑Se丶  阅读(311)  评论(0)    收藏  举报