关于设计模式,我自己也没怎么搞明白,根据书写了个例子,说说我的理解
- //类库代码(即别人写的,不可修改)
- class WaveForm{
- private static long counter;
- private final long id = counter++;
- public String toString(){
- return "WaveForm id: " + id;
- }
- }
- //类库代码,处理WaveForm
- class Fliter{
- public String name(){
- return getClass().getSimpleName();
- }
-
- //和我们的接口微妙不同
- public WaveForm process(WaveForm input){
- return input;
- }
- }
- //很遗憾BOSS告诉你我们的代码必须遵照这个接口
- interface Processor {
- String name();
- Object process(Object obj);
- }
- //Fliter是别人写的,我们无法修改,所以使用适配器
- //适配器,将Fliter接口适配
- class FliterAdapter implements Processor{
- //持有一个fliter
- private Fliter fliter;
-
- private int count;
-
- public FliterAdapter(Fliter fliter) {
- this.fliter = fliter;
- }
-
- @Override
- public String name() {
- return fliter.name();
- }
-
- @Override
- public Object process(Object obj) {
- //我们可以统计fliter.process被调用次数
- ++count;
- System.out.println("fliter.process count: " + count);
- //现在接口终于匹配了
- return fliter.process((WaveForm)obj);
- }
- }
- public class Apply{
- public static void process(Processor p, Object obj){
- System.out.println("Process: " + p.name());
- System.out.println(p.process(obj));
- }
-
- public static void main(String[] args) {
- process(new FliterAdapter(new Fliter()), new WaveForm());
- }
- }
复制代码 适配器模式和代理模式写法差不多。在这个例子,是适配器和代理混用。不过,区别还是有的:
适配器模式:它的主要意图是将接口A适配到接口B上,也就是解决借口不匹配。
代理模式:它的主要意图是分离代码。通常,代理类(proxy)会实现和被代理对象相同的接口。代理还可以做一些额外的事情(比如统计代理对象的某个方法被调用次数、或者进行安全检查)。
|
|