一个例子讲解策略设计模式

假设我们项目中已经有了一个类

public abstract class Car {
    public abstract void setFeature();
}
而且这个类有四个实现类:
public class AudiCar extends Car {
    @Override
    public void setFeature() {
        System.out.println("奥迪四个环");
    }
}

public class BMWCar extends Car {
    @Override
    public void setFeature() {
        System.out.println("宝马别摸我");
    }
}

public class Benz extends Car {
    @Override
    public void setFeature() {
        System.out.println("奔驰三个尖");
    }
}

public class TrucksCar extends Car {
    @Override
    public void setFeature() {
        System.out.println("大货车个头很大");
    }
}

突然有一天,我们的需求变了,我们需要给这个Car增加自动泊车功能,怎么办?
思路一:我们可以在Car这个类里面增加一个抽象方法,比如:

public abstract class Car {
    public abstract void setFeature();
    //新增自动泊车功能
    public abstract void autoPark();
}

这样的话,它的四个实现类都要实现这个自动泊车的方法:

public class AudiCar extends Car {
    @Override
    public void setFeature() {
        System.out.println("奥迪四个环");
    }

    @Override
    public void autoPark() {
        System.out.println("全自动泊车");
    }
}

public class Benz extends Car {
    @Override
    public void setFeature() {
        System.out.println("奔驰三个尖");
    }
    @Override
    public void autoPark() {
        System.out.println("全自动泊车");
    }
}

public class BMWCar extends Car {
    @Override
    public void setFeature() {
        System.out.println("宝马别摸我");
    }
    @Override
    public void autoPark() {
        System.out.println("全自动泊车");
    }
}

public class TrucksCar extends Car {
    @Override
    public void setFeature() {
        System.out.println("大货车个头很大");
    }
    @Override
    public void autoPark() {
        System.out.println("半自动泊车,请注意倒车");
    }
}

这样的话,我们实现了需求,但是这样的话,稍微麻烦,因为AudiCar, Benz, BMWCar这三个类实现自动泊车的功能是一样的,我们完全没有必要这三个类都去重写.
这个时候,策略模式出来了!
思路二:我们把新增的功能抽象出接口:

public interface IAutoPark {
     void autoPark();
}

因为目前需求这个功能有两种具体的实现,一个"全自动泊车",一个"半自动泊车,请注意倒车",所以我们定义两个实现类:

public class AutoParkImp implements IAutoPark {
    @Override
    public void autoPark() {
        System.out.println("全自动泊车");
    }
}

public class HalfAutoParkImp implements IAutoPark {
    @Override
    public void autoPark() {
        System.out.println("半自动泊车,请注意倒车");
    }
}

然后修改Car:

public abstract class Car {
    protected IAutoPark autoPark;
    //它的子类在初始化的时候要传入自己自动泊车功能的具体实现
    public Car(IAutoPark autoPark){
        this.autoPark = autoPark;
    }
    public abstract void setFeature();
    //新增自动泊车功能
    public  void autoPark(){
        autoPark.autoPark();
    }
}

四个子类的实现:

public class AudiCar extends Car {
    public AudiCar(IAutoPark autoPark) {
        super(autoPark);
    }

    @Override
    public void setFeature() {
        System.out.println("奥迪四个环");
    }

}

public class Benz extends Car {
    public Benz(IAutoPark autoPark) {
        super(autoPark);
    }

    @Override
    public void setFeature() {
        System.out.println("奔驰三个尖");
    }
}

public class BMWCar extends Car {
    public BMWCar(IAutoPark autoPark) {
        super(autoPark);
    }

    @Override
    public void setFeature() {
        System.out.println("宝马别摸我");
    }

}

public class TrucksCar extends Car {
    public TrucksCar(IAutoPark autoPark) {
        super(autoPark);
    }

    @Override
    public void setFeature() {
        System.out.println("大货车个头很大");
    }

}

我们在使用的时候:

Car audi = new AudiCar(new AutoParkImp());
audi.setFeature();
audi.autoPark();
Car trucks = new TrucksCar(new HalfAutoParkImp());
trucks.setFeature();
trucks.autoPark();

日志打印:

 System.out: 奥迪四个环
System.out: 全自动泊车
System.out: 大货车个头很大
System.out: 半自动泊车,请注意倒车

所谓的设计模式就是大家总结出来的套路,使用的时候还是要根据自己项目中的需求来选择,不要为了使用而使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,469评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,408评论 19 139
  • 记在前面:这个《设计模式》系列的文章,想了很久才决定写的,一是还是本人的原则,只有通过自己表达出来的东西,才是真正...
    l_sivan阅读 3,823评论 6 17
  • 方法一.使用CAGradientLayer //初始化颜色渐变图层和图层范围CAGradientLayer *la...
    欧辰_OSR阅读 7,512评论 0 14
  • 寻一处深山老林, 造一路陡峭青石阶, 攀一回醉生梦死, 由此而上, 建一座竹林深处小茅屋, 品一口竹叶青茶, 执一...
    肚兜儿阅读 2,773评论 0 3