java利用接口和适配器进行完全解耦
2017-04-19 15:29
197 查看
一.当使用父子类来实现以下东西时,其实是用了向上转型,这段代码的确简单了很多,复用性也很好,但是我们会发现Apply.process()和Processor类耦合过紧,其实apply.process()代码的复用性可以更好的。
运行结果如下:
Using ProcessorUpcase
THIS IS A SUP--SUB COUPLING
Using ProcessorDowncase
this is a sup--sub coupling
Using ProcessorSplitter
[this, is, a, Sup--Sub, Coupling]
这种设计模式被称为策略设计模式,即创建一个能够根据所传递的参数对象的不同而具有不同行为的方法。
二.
看下面一段代码:
我们发现Fileter类与Process类非常相似,他们具有相同的接口元素,但是我们却不能把Filter用于Apply.process()方法。这时候我们解决方案如下:
创建一个Processor接口
public interface Processor{
String name();
Object process(Object input);
}
Filter实现此接口(即public class Filter implements Processor),创建一个新类StringProcessor,实现原类Processor功能,然后让Upcase DownCase Splitter继承StringProcessor,这样Filter也可以用于Apply.process()了。
三.如果Filter类是我们无法修改的,不如类库中类或者别人的jar包,此时,我们可以用适配器设计模式。适配器中的代码将接受你所拥有的接口,并产生你所需要的接口。
说白了,就是创建一个新类实现一个所拥有的接口Processor,此类中有一个Filter的实例,这样就可以实现上文中功能了,只不过是换成了一个新类。
上面三种处理方式其实是循序渐进的,都是因为大家编程中遇到了问题,或者发现代码复用性太低,然后想到的方法或者思想。
原文:http://www.tuicool.com/articles/Uv2YJz
package interfaces.classprocessor; import java.util.*; class Processor{ public String name(){ return getClass().getSimpleName(); } //子类中重写次此方法时用其他类型如string int 等 Object process(Object input){ return input; } } class Upcase extends Processor{ String process(Object input){ return ((String)input).toUpperCase(); } } class Downcase extends Processor{ String process(Object input){ return ((String)input).toLowerCase(); } } class Splitter extends Processor{ String process(Object input){ 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="this is a Sup--Sub Coupling"; public static void main(String[] args){ process(new Upcase(),s); process(new Downcase(),s); process(new Splitter(),s); } }
运行结果如下:
Using ProcessorUpcase
THIS IS A SUP--SUB COUPLING
Using ProcessorDowncase
this is a sup--sub coupling
Using ProcessorSplitter
[this, is, a, Sup--Sub, Coupling]
这种设计模式被称为策略设计模式,即创建一个能够根据所传递的参数对象的不同而具有不同行为的方法。
二.
看下面一段代码:
package interfaces.filters; public class Waveform{ private static long counter; private final long id=counter++; public String toString(){ return "Waveform:"+id; } }
package interfaces.filters; public class Filter{ public String name(){ return getClass().getSimpleName(); } public Waveform process(Waveform input){ return input; } }
我们发现Fileter类与Process类非常相似,他们具有相同的接口元素,但是我们却不能把Filter用于Apply.process()方法。这时候我们解决方案如下:
创建一个Processor接口
public interface Processor{
String name();
Object process(Object input);
}
Filter实现此接口(即public class Filter implements Processor),创建一个新类StringProcessor,实现原类Processor功能,然后让Upcase DownCase Splitter继承StringProcessor,这样Filter也可以用于Apply.process()了。
三.如果Filter类是我们无法修改的,不如类库中类或者别人的jar包,此时,我们可以用适配器设计模式。适配器中的代码将接受你所拥有的接口,并产生你所需要的接口。
说白了,就是创建一个新类实现一个所拥有的接口Processor,此类中有一个Filter的实例,这样就可以实现上文中功能了,只不过是换成了一个新类。
class FilterAdapter implements Processor{ Filter filter; public FilterAdapter(Filter filter){ this.filter=filter; } public String name(){return filter.name();} public Waveform process(Object input){ return filter.process((Waveform)input); } }
上面三种处理方式其实是循序渐进的,都是因为大家编程中遇到了问题,或者发现代码复用性太低,然后想到的方法或者思想。
原文:http://www.tuicool.com/articles/Uv2YJz
相关文章推荐
- 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理
- Java之——利用Comparator接口对多个排序条件进行处理
- java利用HttpClient进行https接口调用
- 利用Java接口对HDFS进行读写操作
- JAVA利用HttpClient进行HTTPS接口调用的方法
- Java之——利用Comparator接口对多个排序条件进行处理
- 利用JMeter的Java请求采样器进行rpc接口的性能测试
- JAVA利用HttpClient进行HTTPS接口调用
- JAVA利用HttpClient进行HTTPS接口调用
- 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试,零基础(2)
- JAVA利用HttpClient进行HTTPS接口调用
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- JAVA利用HttpClient进行HTTPS接口调用
- 适配器(Adapter)设计模式和接口实现完全解耦
- Java 通过工厂模式和接口泛型实现完全解耦
- JAVA 利用Arraylist.sort()进行排序的实现。(comparable接口的实现)
- 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试
- java版的webservice,完全用java的正则表达式对websercice的xml进行解析,可以很快用到web中,只需要调用其中的封装好的方法
- 利用JAVA进行DES数据加密
- 利用Socket进行Java网络编程