java 完全解耦
只要有一个方法操作的是类而非接口,那么你就只能使用这个类及其子类,如果你想要将这个方法应用于不在此继承结构中的某个类,那么你就会触霉头,接口可以在很大程度上放宽这种限制,因此,我们可以编写可服用性更好的代码
- //像本例这样,创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为策略设计
//策略就是传递进去的参数对象,它包含要执行的代码
//: interfaces/classprocessor/Apply.java- package object;
- import java.util.*;
- import static net.mindview.util.Print.*;
- class Processor {
- public String name() {
- return getClass().getSimpleName();
- }
- 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(" "));//split()返回String[]数组
- }
- }
- public class Apply {
- public static void process(Processor p, Object s) {
- print("Using Processor " + p.name());
- print(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);
- }
- } /* Output:
- 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]
- *///:~
适配器设计模式,设配器的代码将接受你所拥有的接口,并产生你所需要的接口
- //: interfaces/interfaceprocessor/FilterProcessor.java
- package interfaces.interfaceprocessor;
- import interfaces.filters.*;
- class FilterAdapter implements Processor {
- Filter filter;
- public FilterAdapter(Filter filter) { //FilterAapter 接受你拥有的接口Filer
- this.filter = filter; //然后生成你需要的Processor接口的对象
- }
- public String name() { return filter.name(); }
- public Waveform process(Object input) {
- return filter.process((Waveform)input);
- }
- }
- public class FilterProcessor {
- public static void main(String[] args) {
- Waveform w = new Waveform();
- Apply.process(new FilterAdapter(new LowPass(1.0)), w);
- Apply.process(new FilterAdapter(new HighPass(2.0)), w);
- Apply.process(
- new FilterAdapter(new BandPass(3.0, 4.0)), w);
- }
- } /* Output:
- Using Processor LowPass
- Waveform 0
- Using Processor HighPass
- Waveform 0
- Using Processor BandPass
- Waveform 0
- *///:~
java 完全解耦的更多相关文章
- 用Spring提高java观察者模式灵活性
在上篇博客 用java观察者模式解耦经典三层架构 的最后,用了一个Client类把Listener的实现类注冊到了LoginEventSource类中,假设须要加入�新的逻辑,加入�新的listene ...
- JAVA平台的理解
主题: JAVA是解释执行还是编译执行? 我的答案 : 混合模式 闲谈 : 1. JAVA(write once,run anywhere): 2. GC(Garbagae Collection), ...
- Java到处运行的基础之 Class 文件
Java 实现一次编译到处运行的基础,来源于 Java 虚拟机屏蔽了操作系统的底层细节.使用 class 文件存储编译后的源程序,使得 Java 程序的编译与操作系统解耦.正是因为 Java clas ...
- maven第三章 maven使用入门
3.1编写pom groupId 一个项目名称 artifactId 子项目(模块)名称 version 开发中的版本,稳定的版本 name 项目名称,方便信息交流 http://news.cnblo ...
- MyBatis持久层框架学习之01 MyBatis的起源和发展
一.MyBatis的简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...
- Activiti进行时——企业工作流生命周期贯通 (zhuan)
http://www.jianshu.com/p/e6971e8a8dad ********************************************** 图1:一个典型的审批工作流程 ...
- WebApplicationInitializer究 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用
本文转自http://hitmit1314.iteye.com/blog/1315816 大家应该都已经知道Spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spri ...
- 深入了解Spring
1.Bean后处理器 Spring容器提供了一个接口InitializingBean,实现这个接口的bean只要重写afterPropertiesSet()或者在XML中添加init-method属性 ...
- servlet3.0无web.xml
大家应该都已经知道spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spring的api或是网络上高手们的博文,也一定很快就学会并且加到自己的应用中去了.PS:如果还 ...
随机推荐
- PHP操作Redis数据库常用方法
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis支持的数据类型有 Stirng(字符串), Lis ...
- Session in BSU CodeForces - 1027F(思维 树 基环树 离散化)
题意: 有n门考试,每门考试都有两个时间,存在几门考试时间冲突,求考完所有的考试,所用的最后时间的最小值 解析: 对于时间冲突的考试 就是一个联通块 把每个考试看作边,两个时间看作点,那么时间冲突的考 ...
- 剖析Hadoop和Spark的Shuffle过程差异(一)
一.前言 对于基于MapReduce编程范式的分布式计算来说,本质上而言,就是在计算数据的交.并.差.聚合.排序等过程.而分布式计算分而治之的思想,让每个节点只计算部分数据,也就是只处理一个分片,那么 ...
- sqlplus执行startup出现ORA-00119,ORA-00132错误
安装好了oracle后,执行如下操作: 执行startup后出现如下错误: ORA-00119: invalid specification for system parameter LOCAL_LI ...
- Django入门项目实践(上)
项目结构 1.建立项目 File -->> New Project... 第一个Location是项目所在的目录,第二个Location是项目独立的Python运行环境,我们称之为Virt ...
- Windows的DOS命令基础
Windows的DOS命令基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.dir: 查看当前路径下的目录(directory)详细信息 . 详细信息: a>.dir ...
- spring cloud微服务架构 服务提供者和服务消费者
服务提供者和服务消费者 下面这张表格,简单描述了服务提供者/消费者是什么: | 名词 | 概念 | | ----- | ----------------------- | | 服务提供者 | 服务 ...
- C语言复习---零散补充
一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...
- Spark记录-Scala异常与处理
Scala try-catch语句 Scala提供try和catch块来处理异常.try块用于包含可疑代码.catch块用于处理try块中发生的异常.可以根据需要在程序中有任意数量的try...cat ...
- JAVA记录-JSP指令
JSP中有三种类型的指令标签 - 序号 指令 说明 1 <%@ page ... %> 定义页面相关属性,如脚本语言,错误页面和缓冲要求. 2 <%@ include ... %&g ...