/*
* 设计模式之适配器模式:
* 当想使用一个已有的类,但是这个类的接口不能拿来直接用,就需要一个适配器来帮忙,其主要
* 作用是在旧接口和新接口之间完成适配。
* 三个特点:
* 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
*/
适配器模式和装饰器模式的区别: