JAVA IO-适配器模式(Adapter)&装饰模式(Decorator)

前          言

   在研究JDK IO源代码可发现,大量使用了适配器模式(Adapter)&装饰模式(Decorator)两种设计模式,以下作简单记录

适配器模式(Adapter)

   定   义: 将被适配类的方法扩展成客户目标接口类方法去表示、调用,目的是消除由于接口不匹配所造成类的不兼容问题。

   分   类:类的适配器模式、对象的适配器模式、接口的适配器模式
         类    适配器模式:将一个类转换成满足另一个新接口的类时,创建Wrapper包装类,继承原有类,实现新的接口即可。
         对象适配器模式:将一个对象转换成满足另一个新接口的对象时,可以创建Wrapper包装类,定义、引入原类实例。

         接口适配器模式:不希望实现一个接口中所有方法时,可创建抽象类Wrapper包装类,实现所有方法,其它实现类继承抽象类并重载去抽取需重写的方法。

  组    成: 目标角色(Target):定义Client使用的与特定领域相关的接口

               客户角色(Client):与符合Target接口的对象协同。

               被适配角色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要适配。

              适配器角色(Adapte) :适配器模式的核心。它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口。 对Adaptee的接口与Target接口进行适配.

 关系设计图:关系图&源代码见 引用:http://blog.csdn.net/a394268045/article/details/51801258)

       类   适配器模式:

                          
       对象适配器模式:

                              

       接口适配器模式:

                                

  装饰模式(Decorator)

     

       动态给类进行装饰并增加一些新的功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例.

       归纳组成:
              • Component为统一接口,也是装饰类和被装饰类的基本类型.
              • ConcreteComponent为具体实现类,也是被装饰类,他本身是具有一些功能的完整的类.
              • Decorator是装饰类,实现Component接口的同时还在内部维护一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰 的子类。而其子类才是赋有具体装饰效果的装饰产品类。

              • ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

        关系设计图:

                             

        代码   实现:

        interface Component:

public interface Component {
	public void CarBrand();//品牌
	public void CarType();//类型 SUV 
}
     被装饰类具体实现类ConcreteComponent:
public class ConcretComponent implements Component{
	@Override
	public void CarBrand() {
		System.out.print("宝马:");
	}

	@Override
	public void CarType() {
		System.out.println("SUV");
	}

}
      被装饰类具体实现类ConcreteComponentB:
public class ConcretComponentB implements Component{
	@Override
	public void CarBrand() {
		System.out.print("别克:");
	}

	@Override
	public void CarType() {
		System.out.println("普通");
	}
}
    装饰类Decorator:
public class Decorator implements Component {
	public Component component;
	public Decorator(Component component) {
		this.component = component;
	}
	@Override
	public void CarBrand() {
		this.component.CarBrand();
	}
	@Override
	public void CarType() {
		this.component.CarType();
	}
	//增加被修饰类之外方法
	public void CarRmoule() {
		System.out.println("改造中...");
	}
}
  装饰产品类具体ConcreteDecorator子类:
public class ConcreteDecorator extends Decorator {
	public ConcreteDecorator(Component component) {
		super(component);
	}
	public void CarBrand() {
		this.component.CarBrand();
	}
	public void CarType() {
		this.component.CarType();
	}
	public void CarRmoule() {
		System.out.println("加入 天窗...");
	}
}
   Client实现:

 

public class DecoratorTest {

	public static void main(String[] args) {
		Decorator decorator = new ConcreteDecorator(new ConcretComponent());
		//调用被装饰类具体子ConcretComponent方法
		decorator.CarBrand();
		decorator.CarType();
		//装饰类新增方法
		decorator.CarRmoule();
		Decorator decorator_ = new ConcreteDecorator(new ConcretComponentB());
		decorator_.CarBrand();
		decorator_.CarType();
		decorator.CarRmoule();
                System.out.println("****************************");
		Component component = new ConcreteDecorator(new ConcretComponent());
		//调用被装饰类具体子ConcretComponent方法
		component.CarBrand();
		component.CarType();
		Component componentB = new ConcreteDecorator(new ConcretComponentB());
		componentB.CarBrand();
		componentB.CarType();
	}
}
输出: 宝马:SUV  加入 天窗...
  别克:普通  加入 天窗...
  ****************************
   宝马:SUV  别克:普通






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值