李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
接口中的策略设计模式
Leefs
2019-10-18 AM
1539℃
0条
# 接口中的策略设计模式 ### 前言 只要一个方法操作的是类而非接口,那么你就只能使用这个类及其子类。如果你想要将这个方法应用于不在此继承结构中的某个类,那么你就会触霉头了。 通过上面文字我们可以很清楚的知道,类与类之间的耦合度太高导致我们在进行类的相互调用时,产生许多不便之处。 **那么下一步我们需要做什么呐?** 答案是:**解耦** ### 代码示例 ```java class Processor { /** * 返回类名 * @return 类名 */ public String name() { return getClass().getSimpleName(); } /** * 返回object对象 * @param input 传入object对象 * @return 返回object对象 */ Object process(Object input) { return input; } } class Upcase extends Processor { String process(Object input) { // Covariant return return ((String) input).toUpperCase(); } } class Downcase extends Processor { String process(Object input) { return ((String) input).toLowerCase(); } } class Splitter extends Processor { String process(Object input) { // The split() argument divides a String into pieces: return Arrays.toString(((String) input).split(" ")); } } public class Apply { public static void process(Processor p, Object s) { System.out.println("Using Processor " + p.name()); System.out.println(p.process(s)); } public static String s = "Disagreement with beliefs is by definition incorrect"; public static void main(String[] args) { process(new Upcase(), s); process(new Downcase(), s); process(new Splitter(), s); } } ``` 运行结果 ``` java Using Processor Upcase DISAGREEMENT WITH BELIEFS IS BY DEFINITION INCORRECT Using Processor Downcase disagreement with beliefs is by definition incorrect Using Processor Splitter [Disagreement, with, beliefs, is, by, definition, incorrect] ``` (本例来自 Thinking in Java p175 ) > 参数说明 **getClass().getSimpleName():** 返回源代码中给出的底层类的简称 。 **toUpperCase():**方法用于将小写字符转换为大写 **toLowerCase():**方法将字符串转换为小写 > 代码执行过程分析: 1. 1.执行main函数中的**process(new Upcase(), s);**语句; 2. 2.创建**Upcase**对象; 3. 3.调用父类**Processor**类,并对父类进行初始化; 4. 4.对子类Upcase类进行初始化操作; 5. 5.执行静态方法process(); 6. 6.执行输出语句; 7. 7.调用父类**Processor**类中的name()方法; 8. 8.返回参数,并在控制台输出**Using Processor Upcase**; 9. 9.执行输出语句; 10. 10.调用子类Upcase重写父类**Processor**类的process()方法; 11. 11.在控制台输出语句**DISAGREEMENT WITH BELIEFS IS BY DEFINITION INCORRECT** > 关键代码分析 ```java public static void process(Processor p, Object s) { System.out.println("Using Processor " + p.name()); System.out.println(p.process(s)); } ``` 因为Upcase类、Downcase类、Splitter类都继承了同一个父类Processor,静态方法process()实现了不管任何的不同类型的子类都可以通过该方法去调用父类方法,并且执行子类中自己重写父类的特有方法。 Apply.process()方法可以接受任何类型的Processor,并将其应用到一个Object对象上,然后打印输出结果。 注:本例中的子类返回类型都是[协变返回类型]( https://lilinchao.com/archives/12.html ) ### 总结 像本例这样,创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为策略设计模式。这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分。策略就是传递进去的参数对象,它包含要执行的代码。这里,Processor对象就是一个策略,在main()方法中可以看到有三种不同类型的策略应用到了String类型中的s对象上。
标签:
Java
,
Java编程思想
,
JavaSE
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/39.html
上一篇
抽象类和抽象方法练习
下一篇
接口中的适配器设计模式(一)
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
递归
DataX
持有对象
线程池
Java阻塞队列
CentOS
Elasticsearch
散列
序列化和反序列化
MyBatis-Plus
Elastisearch
Redis
Azkaban
Shiro
MyBatis
Java编程思想
NIO
二叉树
SpringCloud
HDFS
MyBatisX
FileBeat
RSA加解密
Spring
工具
Git
Zookeeper
Kibana
Filter
nginx
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞