1. 适配器模式
通过一个简单的例子说一下适配器模式,适配器模式属于接口型模式。适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供。
/**
* Android规格的充电头
*/
public interface AndroidCharge {
void isAndroidHeader();
}
/**
* 苹果手机的插头规格
*/
public interface IphoneCharge {
void isIphoneHeader();
}
public class AndroidPhone implements AndroidCharge {
@Override
public void isAndroidHeader() {
System.out.println("Andorid充电头");
}
}
/**
* 类适配器模式,将你手上的iPhone充电头适配成Android的充电头。
*/
public class Adapter extends AndroidPhone implements IphoneCharge {
@Override
public void isIphoneHeader() {
isAndroidHeader();
}
}
/**
* 对象适配器
*/
public class Adapter2 implements IphoneCharge {
private AndroidCharge androidCharge;
public Adapter2(AndroidCharge androidCharge) {
this.androidCharge = androidCharge;
}
@Override
public void isIphoneHeader() {
androidCharge.isAndroidHeader();
}
}
public class Test {
public static void main(String[] args) {
IphoneCharge p = new Adapter();
((Adapter) p).isAndroidHeader();
}
}
2. 装饰者模式
装饰者模式: 动态地将责任附加到对象上,对扩展功能来说,装饰者比继承更有弹性更灵活(因为子类继承父类扩展功能的前提,是已知要扩展的功能是什么样的,而这是在编译时就要确定的,但是装饰者模式可以实现动态(在运行时)去扩展功能).
比如有一个可乐对象,那我用一个加冰对象装饰一下,再用加糖对象装饰一下,最后能得到一个加冰加糖可乐,这时候就将原可乐对象扩展,得到了加冰和加糖两种装饰.
public abstract class Drink {
String name;
public abstract int price();
public String getName() {
return name;
}
}
public class CocaCola extends Drink{
public CocaCola() {
name = "Coca Cola";
}
@Override
public int price() {
return 30;
}
}
public class Beer extends Drink {
public Beer() {
name="Beer";
}
@Override
public int price() {
return 6;
}
}
public abstract class Decorator extends Drink{
protected Drink drink;
public Decorator(Drink drink) {
this.drink = drink;
}
}
public class VinegarDecorator extends Decorator {
public VinegarDecorator(Drink drink) {
super(drink);
}
public void addVinegar(){
System.out.println("加醋");
}
@Override
public int price() {
return 5+drink.price();
}
@Override
public String getName() {
return "加醋的"+drink.getName();
}
}
public class WaterDecorator extends Decorator {
public WaterDecorator(Drink drink) {
super(drink);
}
public void addWater(){
System.out.println("饮料兑水");
}
@Override
public int price() {
return 2+drink.price();
}
@Override
public String getName() {
addWater();
return "兑水了的"+drink.getName();
}
}
public class Test {
public static void main(String[] args) {
Drink drink = new CocaCola();
drink = new WaterDecorator(drink);
drink = new VinegarDecorator(drink);
System.out.println(drink.getName()+"---价格:"+drink.price());
}
}