设计模式--策略模式(strategy)
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:要写一篇好的博客真的好辛苦也好不容易啊····)
最后推荐大家看这两篇博客 1 和 2
设计模式--策略模式(strategy)的更多相关文章
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- 设计模式——策略模式(Strategy Pattern)
写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...
- 说说设计模式~策略模式(Strategy)
返回目录 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(in ...
- C#设计模式——策略模式(Strategy Pattern)
一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...
- 设计模式-策略模式Strategy以及消灭if else
概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如 ...
- 设计模式---策略模式Strategy(对象行为型)
1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不 ...
- 大话设计模式--策略模式 strategy -- C++实现实例
1. 策略模式: 它定义了算法家族, 分别封装起来,使他们之间可以相互替换,此模式让算法变化, 不会影响到使用算法的客户. 用相同的方法调用不同的算法,减少各种算法类与使用算法类之间的耦合. 实例中策 ...
随机推荐
- iperf 指令
1. 测试UDP丢包率 30个现成以5Mbps速度测试60s iperf -u -c 目的IP -b 5M -P 30 -t 60 测试TCP丢包率 iperf -c 目的IP -b 5M -P 30 ...
- TSQL--INT转换成指定长度字符串
-- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ...
- Angularjs 分页控件
实现效果: 实现步骤: 1.分页页面:page.html,页面多余样式,需要自己去除. <div class="row" ng-show="conf.totalIt ...
- docker容器怎么设置开机启动
https://my.oschina.net/lwenhao/blog/1923003 docker服务器.以及容器设置自动启动 一.docker服务设置自动启动 说明:适用于yum安装的各种服务 查 ...
- Mysql 中日期类型bigint和datetime互转
MySql数据库中字段类型bigint 长度是10位的 mysql> select (from_unixtime(1554047999))as datatime;+--------------- ...
- JAVA特性一:封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 封装概念详解:封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口. 面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完 ...
- springmvc执行流程 源码分析
进入DispatcherServlet 执行onRefresh,然后执行初始化方法initStrategies.然后调用doService——>doDispatch. 根据继承关系执行Servl ...
- 九、基础正则表达式BRE
1.重要性:简单的说正则表达式就是处理一套字符串的规则和方法,以行为单位对字符串进行处理. 运维工作中,会有大量的访问日志,错误日志,大数据学习正则表达式是不可少的. 2.linux正则表达式,主要是 ...
- “全栈2019”Java第一百零九章:匿名内部类实现唯一抽象类或接口
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 洛谷P4250 [SCOI2015]小凸想跑步(半平面交)
题面 传送门 题解 设\(p\)点坐标为\(x_p,y_p\),那么根据叉积可以算出它与\((i,i+1)\)构成的三角形的面积 为了保证\(p\)与\((0,1)\)构成的面积最小,就相当于它比其它 ...