当一类事物有多种不同的实现方式且后续仍有扩展的可能性时,可以先定义一个统一接口,让所以调用该事务的方法定义时均传入该接口。
实际调用时,根据实际情况传入该接口的不同实现,也就是不同的策略。扩展时,只要新增类实现上述统一接口,即可作为新的策略以供调用。本质上是多态的应用
/**
* 王者荣耀英雄猴子
* */
public class Sunwukong {
//默认使用原始皮肤
public Skin skin= new OriginalSkin();
//默认构造方法不传入皮肤
public Sunwukong(){
}
//构造时传入皮肤接口,当用户创建英雄时,可以传入实现皮肤接口的实例皮肤覆盖原始皮肤
public Sunwukong(Skin skin){
this.skin=skin;
}
}
/**
* 皮肤接口,后面所有的皮肤都要实现里面的方法
* */
public interface Skin {
//释放技能
public void relaese();
}
/**
* 原始皮肤释放技能无特效
* */
public class OriginalSkin implements Skin{
@Override
public void relaese() {
System.out.println("释放技能无特效");
}
}
/**
* 地狱火皮肤释放技能全身变红
*/
public class DiyuhuoSkin implements Skin{
@Override
public void relaese() {
System.out.println("释放技能全身变红");
}
}
/**
* 至尊宝皮肤释放技能全身变蓝
* */
public class ZhizunbaoSkin implements Skin{
@Override
public void relaese() {
System.out.println("释放技能全身变蓝");
}
}
public class Main {
public static void main(String[] args) {
//这个猴子没特效
Sunwukong s1 =new Sunwukong();
s1.skin.relaese();
//这个猴子地狱火皮肤,有特效
Sunwukong s2 = new Sunwukong(new DiyuhuoSkin());
s2.skin.relaese();
//这个猴子至尊宝皮肤,也有特效
Sunwukong s3 = new Sunwukong(new ZhizunbaoSkin());
s2.skin.relaese();
}
}
运行结果:
释放技能无特效
释放技能全身变红
释放技能全身变红
说明:后续出新皮肤只要实现皮肤接口即可.按照不同特效实现relaese()方法。调用的时候传入新的皮肤实例就可以完成扩展。而且低耦合