设计模式之适配器模式和装饰器模式

/*
 * 设计模式之适配器模式:
 * 当想使用一个已有的类,但是这个类的接口不能拿来直接用,就需要一个适配器来帮忙,其主要
 * 作用是在旧接口和新接口之间完成适配。
 * 三个特点:
 * 1、适配器对象实现原有接口
 * 2、适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
 * 3、对适配器原有接口方法的调用被委托给新接口的实例的特定方法
 * 
 */

interface CnPluginInterface{
	void chargeWith2Pins();
}
class CnPlugin implements CnPluginInterface{
	public void chargeWith2Pins(){
		System.out.println("charge with CnPlugin");
	}
}

class Home{
	private CnPluginInterface cnPlugin;
	public Home(){}
	public Home(CnPluginInterface cnPlugin){
		this.cnPlugin=cnPlugin;
	}
	public void setPlugin(CnPluginInterface cnPlugin){
		this.cnPlugin = cnPlugin;
	}
	public void charge(){
		cnPlugin.chargeWith2Pins();
	}
}

//public class Main {
//
//	/**
//	 * @param args
//	 */
//	public static void main(String[] args) {
//		// TODO Auto-generated method stub
//		CnPluginInterface cnPlugin = new CnPlugin();
//		Home home = new Home(cnPlugin);
//		home.charge();
//	}
//
//}
///*测试结果:charge with CnPlugin
// * 
// */

interface EnPluginInterface{
	void chargeWith3Pins();
}
class EnPlugin implements EnPluginInterface{
	public void chargeWith3Pins(){
		System.out.println("charge with EnPlugin");
	}
}
class PluginAdapter implements CnPluginInterface{
	//适配器实现了英标的插头,然后重载国标的充电方法作为英标的方法
	private EnPluginInterface enPlugin;
	public PluginAdapter ( EnPluginInterface enPlugin){
		this.enPlugin = enPlugin;
	}
	@Override
	public void chargeWith2Pins() {
		// TODO Auto-generated method stub
		enPlugin.chargeWith3Pins();
	}
}


public class Main{
	public static void main(String args[]){
		EnPluginInterface enPlugin = new EnPlugin();
		Home home = new Home();
		PluginAdapter pluginAdapter = new PluginAdapter(enPlugin);
		home.setPlugin(pluginAdapter);
		home.charge();
	}
}
/*
 * 测试结果:charge with EnPlugin
 */

/*
 * 设计模式之装饰器模式
 * Decorator Pattern 就是动态地把职责附加到已有对象上去,实现功能扩展。
 * Java IO类中有一个经典的装饰者模式应用,BufferReader 装饰了InputStreamReader
 * InputStreamReader(InputStream in)读取bytes字节内容,然后转换成characters流输出。
 * BufferedReader 从characters流中读取内容并缓存
 * 
 */
abstract class Girl{
	String description = "no particular";
	public String getDescription(){
		return description;
	}
}
class AmericanGirl extends Girl{
	public AmericanGirl(){
		description ="AmericanGirl";
	}
}
class ChineseGirl extends Girl{
	public ChineseGirl(){
		description = "ChineseGirl";
	}
}
abstract class GirlDecrator extends Girl{
	public abstract String getDescription();
}

class GoldenHair extends GirlDecrator{
	private Girl girl;
	public GoldenHair(Girl g){
		girl = g;
	}
	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return girl.getDescription()+" with golden hair";
	}
	
}

class Tall extends GirlDecrator{
	private Girl girl;
	public Tall(Girl g){
		girl = g;
	}

	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return girl.getDescription()+" is very tall";
	}
	
}

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Girl gl = new AmericanGirl();
		System.out.println(gl.getDescription());
		
		GoldenHair g2= new GoldenHair(gl);
		System.out.println(g2.getDescription());
		
		Tall g3= new Tall(g2);
		System.out.println(g3.getDescription());
	}

}/*
 * 测试结果:AmericanGirl
		  AmericanGirl with golden hair
		  AmericanGirl with golden hair is very tall
*/

适配器模式和装饰器模式的区别:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值