只要有一个方法操作的是类而非接口,那么你就只能使用这个类及其子类,如果你想要将这个方法应用于不在此继承结构中的某个类,那么你就会触霉头,接口可以在很大程度上放宽这种限制,因此,我们可以编写可服用性更好的代码

  1. //像本例这样,创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为策略设计
    //策略就是传递进去的参数对象,它包含要执行的代码
    //: interfaces/classprocessor/Apply.java
  2. package object;
  3. import java.util.*;
  4. import static net.mindview.util.Print.*;
  5.  
  6. class Processor {
  7. public String name() {
  8. return getClass().getSimpleName();
  9. }
  10. Object process(Object input) { return input; }
  11. }
  12.  
  13. class Upcase extends Processor {
  14. String process(Object input) { // Covariant return
  15. return ((String)input).toUpperCase();
  16. }
  17. }
  18.  
  19. class Downcase extends Processor {
  20. String process(Object input) {
  21. return ((String)input).toLowerCase();
  22. }
  23. }
  24.  
  25. class Splitter extends Processor {
  26. String process(Object input) {
  27. // The split() argument divides a String into pieces:
  28. return Arrays.toString(((String)input).split(" "));//split()返回String[]数组
  29. }
  30. }
  31.  
  32. public class Apply {
  33. public static void process(Processor p, Object s) {
  34. print("Using Processor " + p.name());
  35. print(p.process(s));
  36. }
  37. public static String s =
  38. "Disagreement with beliefs is by definition incorrect";
  39. public static void main(String[] args) {
  40. process(new Upcase(), s);
  41. process(new Downcase(), s);
  42. process(new Splitter(), s);
  43. }
  44. } /* Output:
  45. Using Processor Upcase
  46. DISAGREEMENT WITH BELIEFS IS BY DEFINITION INCORRECT
  47. Using Processor Downcase
  48. disagreement with beliefs is by definition incorrect
  49. Using Processor Splitter
  50. [Disagreement, with, beliefs, is, by, definition, incorrect]
  51. *///:~

适配器设计模式,设配器的代码将接受你所拥有的接口,并产生你所需要的接口

  1. //: interfaces/interfaceprocessor/FilterProcessor.java
  2. package interfaces.interfaceprocessor;
  3. import interfaces.filters.*;
  4.  
  5. class FilterAdapter implements Processor {
  6. Filter filter;
  7. public FilterAdapter(Filter filter) { //FilterAapter 接受你拥有的接口Filer
  8. this.filter = filter; //然后生成你需要的Processor接口的对象
  9. }
  10. public String name() { return filter.name(); }
  11. public Waveform process(Object input) {
  12. return filter.process((Waveform)input);
  13. }
  14. }
  15.  
  16. public class FilterProcessor {
  17. public static void main(String[] args) {
  18. Waveform w = new Waveform();
  19. Apply.process(new FilterAdapter(new LowPass(1.0)), w);
  20. Apply.process(new FilterAdapter(new HighPass(2.0)), w);
  21. Apply.process(
  22. new FilterAdapter(new BandPass(3.0, 4.0)), w);
  23. }
  24. } /* Output:
  25. Using Processor LowPass
  26. Waveform 0
  27. Using Processor HighPass
  28. Waveform 0
  29. Using Processor BandPass
  30. Waveform 0
  31. *///:~

java 完全解耦的更多相关文章

  1. 用Spring提高java观察者模式灵活性

    在上篇博客 用java观察者模式解耦经典三层架构 的最后,用了一个Client类把Listener的实现类注冊到了LoginEventSource类中,假设须要加入�新的逻辑,加入�新的listene ...

  2. JAVA平台的理解

    主题:  JAVA是解释执行还是编译执行? 我的答案 : 混合模式 闲谈 : 1. JAVA(write once,run anywhere): 2. GC(Garbagae Collection), ...

  3. Java到处运行的基础之 Class 文件

    Java 实现一次编译到处运行的基础,来源于 Java 虚拟机屏蔽了操作系统的底层细节.使用 class 文件存储编译后的源程序,使得 Java 程序的编译与操作系统解耦.正是因为 Java clas ...

  4. maven第三章 maven使用入门

    3.1编写pom groupId 一个项目名称 artifactId 子项目(模块)名称 version 开发中的版本,稳定的版本 name 项目名称,方便信息交流 http://news.cnblo ...

  5. MyBatis持久层框架学习之01 MyBatis的起源和发展

    一.MyBatis的简介  MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...

  6. Activiti进行时——企业工作流生命周期贯通 (zhuan)

    http://www.jianshu.com/p/e6971e8a8dad ********************************************** 图1:一个典型的审批工作流程 ...

  7. WebApplicationInitializer究 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用

    本文转自http://hitmit1314.iteye.com/blog/1315816 大家应该都已经知道Spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spri ...

  8. 深入了解Spring

    1.Bean后处理器 Spring容器提供了一个接口InitializingBean,实现这个接口的bean只要重写afterPropertiesSet()或者在XML中添加init-method属性 ...

  9. servlet3.0无web.xml

    大家应该都已经知道spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spring的api或是网络上高手们的博文,也一定很快就学会并且加到自己的应用中去了.PS:如果还 ...

随机推荐

  1. PHP操作Redis数据库常用方法

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis支持的数据类型有 Stirng(字符串), Lis ...

  2. Session in BSU CodeForces - 1027F(思维 树 基环树 离散化)

    题意: 有n门考试,每门考试都有两个时间,存在几门考试时间冲突,求考完所有的考试,所用的最后时间的最小值 解析: 对于时间冲突的考试 就是一个联通块 把每个考试看作边,两个时间看作点,那么时间冲突的考 ...

  3. 剖析Hadoop和Spark的Shuffle过程差异(一)

    一.前言 对于基于MapReduce编程范式的分布式计算来说,本质上而言,就是在计算数据的交.并.差.聚合.排序等过程.而分布式计算分而治之的思想,让每个节点只计算部分数据,也就是只处理一个分片,那么 ...

  4. sqlplus执行startup出现ORA-00119,ORA-00132错误

    安装好了oracle后,执行如下操作: 执行startup后出现如下错误: ORA-00119: invalid specification for system parameter LOCAL_LI ...

  5. Django入门项目实践(上)

    项目结构 1.建立项目 File -->> New Project... 第一个Location是项目所在的目录,第二个Location是项目独立的Python运行环境,我们称之为Virt ...

  6. Windows的DOS命令基础

    Windows的DOS命令基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.dir: 查看当前路径下的目录(directory)详细信息 . 详细信息: a>.dir ...

  7. spring cloud微服务架构 服务提供者和服务消费者

    服务提供者和服务消费者 下面这张表格,简单描述了服务提供者/消费者是什么:   | 名词 | 概念 | | ----- | ----------------------- | | 服务提供者 | 服务 ...

  8. C语言复习---零散补充

    一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...

  9. Spark记录-Scala异常与处理

    Scala try-catch语句 Scala提供try和catch块来处理异常.try块用于包含可疑代码.catch块用于处理try块中发生的异常.可以根据需要在程序中有任意数量的try...cat ...

  10. JAVA记录-JSP指令

    JSP中有三种类型的指令标签 - 序号 指令 说明 1 <%@ page ... %> 定义页面相关属性,如脚本语言,错误页面和缓冲要求. 2 <%@ include ... %&g ...