1.策略模式(strategy ['strætədʒi])

我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈)

看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看

他们生产鸭子,我们就制造人

父类 Person类

 public abstract class Person {
//唱歌可就不一样了,唱法不同,唱功不同;而且哑巴不能唱歌
public void singing(){
System.out.println("我要唱歌");
} //吃饭,大家没什么区别吧
public abstract void eating();
}

/*每个人都会吃饭,所以eating()可以继承,但singing()就不能一样处理了,因为有些人天生不能发声,或者差别很大

所以在Person类中就不应该写这个方法,否则Dummy哑巴类就会从Person类继承到singing(),这明显是不合理的,

而这里可以考虑将singing()独立成一个singable接口,

 public interface Singable {
public void sing();
}

实现singable的ZhangSan:

public class ZhangSan extends Person implements Singable{
@Override
public void sing() {
// TODO Auto-generated method stub } }

再根据需要实现这个接口,原理上是可以实现,但是接口有个缺点:

就是不能实现具体的方法:接口什么都不做,你实现后还是要写代码,根本做不到代码重用,如果实现接口的类数量很大的话,

那这个工作量很不划算。

**虽然每个人唱歌都不同,而且还有人不能唱,但其实唱歌的种类是可以预计的

唱法也就那么几种:通俗,美声,民族,R&B·····

接口是不能重用代码,那我们就先预先实现一组的接口实现类

通俗唱法:

public class TongSuSinging implements Singable {

    @Override
public void sing() {
System.out.println("找不到方向,到彩虹天堂·····");
} }

美声唱法:

public class MeiShengSinging implements Singable{

    @Override
public void sing() {
System.out.println("you and me,together.");
} }

民族唱法:

public class MinZuSinging implements Singable{

    @Override
public void sing() {
System.out.println("五十六个民族,五十六枝花....");
} }

这里,我们不打算直接实现singable接口类,而是使用了组合,所以父类Person类,修改成:

public abstract class Person {
//使用组合,将Singable作为Person的成员变量
private Singable singable;
//再增加动态赋值的方法
public void setSingable(Singable s){
singable = s;
}
//此时的sing()方法应该这样写
public void sing(){
singable.sing();//这里就是面向接口编程,可以使用多态
} //吃饭,大家没什么区别吧
public abstract void eating();
}

李四类,

 public class LiSi extends Person {

     @Override
public void eating() {
// TODO Auto-generated method stub } }

测试类Test

 public class Test {

     public static void main(String[] args) {
LiSi ls = new LiSi();
//想要美声唱法,那就生成美声唱法的对象,但是类型统一用Singable
Singable s = new MeiShengSinging();
ls.setSingable(s);
ls.sing(); //想要通俗唱法,就生成通俗唱法的对象
s = new TongSuSinging();//调用的代码完全不变,仅仅是new的对象类型变了而已
ls.setSingable(s);
ls.sing();
} }

我也说一下我对策略模式的看法吧,有错误欢迎指正,大家共同进步嘛

优势:

如上所述,第一:避免了普通继承的一味重复,因为不变的内容还留在父类中,会改变的内容通过组合的方式来加成;

第二:同时使用了面向接口编程,代码修改率大大变小(其实所有的设计模式都有这个优点,不再是一次性代码了)

第三:用户要实现不同的功能是只要实现接口,生成新的类就可以了,并且这些类之间是可以随时替换的(因为多态嘛)

缺点:第一:还是要生成不少类(每个方法一个类···)

第二:你要预先知道大概要生成多少个类,(虽然总数不能确定,但变化是可以预见的情况下,才推荐使用策略模式)

*/

(PS:要写一篇好的博客真的好辛苦也好不容易啊····)

最后推荐大家看这两篇博客 12

最新文章

  1. (转载)开始iOS 7中自动布局教程(一)
  2. 全新 Mac 安装指南(通用篇)(推荐设置、软件安装、推荐软件)
  3. Glut 回调函数小结
  4. 爪哇国新游记之三十四----Dom4j的XPath操作
  5. Python字符串分割
  6. SQL Case When Then
  7. 0c-36-自动释放池应用场景
  8. linux SPI bus demo hacking
  9. HDU 4762 Cut the Cake
  10. Fluent NHibernate之旅
  11. CVPR2011录取结果
  12. nat模式、路由模式,网桥模式
  13. 使用IDEA动态调试smali代码
  14. 【转】在PC上测试移动端网站和模拟手机浏览器的5大方法
  15. ABP .Net Core API和Angular前端APP独立部署跨域问题(No Access-Control-Allow-Origin)
  16. c++中各类型数据所占字节数(一)
  17. Java窗体简单登入案例(附带源码)
  18. HTML基础之HTML标签-html header(meta,title) html body(p,br,h,form,div,span,input,lable)
  19. Go指南_切片的长度与容量
  20. 了解ORACLE培训OCA-OCP-OCM课程表

热门文章

  1. [翻译] Writing Property Editors 编写属性编辑器
  2. 转:Entity FrameWork利用Database.SqlQuery<T>执行存储过程并返回参数
  3. [转]解决Mysql InnoDB: Failing assertion: ret || !assert_on_error问题
  4. python signal
  5. windows过滤指定IP
  6. testNG的高级用法 --DataProvider
  7. 解决IE8不支持console
  8. list<T>集合中的Remove()、RemoveAt()、RemoveRange()、RemoveAll()的用法
  9. .NET中的异常处理机制(二)
  10. WPF XamlObjectWriterException:无法创建未知类型"Grid"