首页 文章 精选 留言 我的

精选列表

搜索[design],共3122篇文章
优秀的个人博客,低调大师

Design Pattern: Adapter 模式 - Object Adapter

您的电脑是个旧电脑,新的滑鼠都在使用USB接口了,而您的电脑上并没有USB,而只有一个PS2接口,这时您可以使用一个USB转PS2的接头作为转换,这样您的电脑就可以使用新滑鼠了(当然您也可以使用USB扩充卡,意思是相同的)。 类似的概念,有时候您想在原来的程式中加入一个外部元件,例如一个类别,但是这个类别与您目前所设计的程式在介面上并不一致,为了让这个外部类与原程式的介面一致,您必须使用一个类别作为中介来配接它们,这时您可以采用Adapter模式。 举个例子来说,在Java 1.0中有个Enumeration,您在这个版本发行之后,使用它来设计了一个MessageApplication,例如: MessageApplication.java import java.util.*; public class MessageApplication { public void showAllMessage(Enumeration enum) { Object msg; while(enum.hasMoreElements()) { msg = enum.nextElement(); System.out.println(msg); } } } 您的客户端程式是这么使用MessageApplication的: MessageClient.java import java.util.*; public class MessageClient { private MessageApplication msgApp; public void run() { Vector vector = new Vector(); for(int i = 0; i < 10; i++) vector.addElement("物件 " + i); msgApp = new MessageApplication(); msgApp.showAllMessage(vector.elements()); } public static void main(String[] args) { MessageClient msgClient = new MessageClient(); msgClient.run(); } } 现在Java 1.2中新增了Iterator,您想要使用它的功能,但基本上您不想更动原来程式中已设计好的MessageApplication类别,这时候您可以 使用Adapter模式,将Iterator的介面转换为Enumeration相容,例如: IteratorAdapter.java import java.util.*; public class IteratorAdapter implements Enumeration { private Iterator iterator; IteratorAdapter(Iterator iterator) { this.iterator = iterator; } // 转接介面 public boolean hasMoreElements() { return iterator.hasNext(); } public Object nextElement() throws NoSuchElementException { return iterator.next(); } } 您可以在客户端程式中照样使用MessageApplication类别,而不用作任何的变动: MessageClient.java import java.util.*; public class MessageClient { // We could still use MessageApplication private Enumeration iteratorAdapter; public void run() { List arrayList = new ArrayList(); for(int i = 0; i < 10; i++) arrayList.add("物件 " + i); iteratorAdapter = new IteratorAdapter(arrayList.iterator()); // We could still use MessageApplication MessageApplication msgApp = new MessageApplication(); msgApp.showAllMessage(iteratorAdapter); } public static void main(String[] args) { MessageClient msgClient = new MessageClient(); msgClient.run(); } } 如程式所示的,透过Adapter模式,您原有程式中已设计好的类别不用更动,就可以引进新类别的功能,将上面的程式UML类别结构画出如下: 上面的作法,是将要引进的新类别当作Adapter类别的一个物件成员,这是IbObject Adapter模式,其抽象结构如下: ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2467025.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Design Pattern: Adapter 模式 - Class Adapter

Adapter模式的另一种作法是Class Adapter模式,在这个模式下,Adapter直接继承Adaptee(要引进的新类别),以拥有当中的成员及方法,在C++中的话可以这么作: C++中可以多重继承,但在Java中不行,所以在Java中若要采用Class Adapter,必须作点修改,一方面继承Adaptee,一方面实作Target的介面: 代码的实现是这样的: public class Adapter extends Adaptee implements Target { // .... } 当然,这必须您原先的Target定义了共同的介面,所以Class Adapter在Java中适用的场合较少,事实上,也比较建议使用Object Adapter,这样的Adapter模式比较有弹性,例如,您可以在Adapter上加上个setter,以随时可以抽换Adaptee。 在Java中,Class Adapter的一个应用场合是达到多重继承的效果,您一定在很多时候听别人说,介面(interface)可以达到多重继承的效果,这是怎么回事? 其实要讨论这个问题,首先您对于C++中多重继承要先有认识,新手看了书说介面可以达到多重继承,切莫人云亦云,尤其是没有学过C++的新手们,如果您对 于C++多重继承想要有所认识,请先看看多 重继承(一)与多 重继承(二)。 Java不能多重继承,但为何说Java中可以使用介面(interface)来达到多重继承的效果,首先效果之一,就如多 重继承(二)中描述的“ 多重继承时通常其中一个基底类别作为private实作体,而其它的用以表现完全的抽象介面。”,在Java中这个效果可以使用介面来达到,介面此时所扮 演的即多 重继承(二)中的抽象类别,一个完全的抽象介面,这个效果的达成方式,如介 面(interface)型态中所介绍的,您可以直接对应这两个主题中的程式实作来了解,了解Java中如何使用介面(interface)来达到C++中所谓多重继承的“一种”效 果。 来看看另一个情况。 如果有SomeClass类别与OtherClass类别,您想要SomeAndOther类别可以同时拥有SomeClass类别与 OtherClass类别中已定义好的操作,并可以进行多型操作,在C++中可以用多重继承来达到,但在Java中显然的无法使用多重继承,怎么办?您可 以在设计上先绕个弯,先使用两个介面分别定义好SomeClass与OtherClass两个类别的公开方法,例如: public interface ISome { public void doSome(); } public interface IOther { public void doOther(); } 接着让SomeClass与OtherClass分别实作两个介面: public class SomeClass implements ISome { public void doSome() { .... } } public class OtherClass implements IOther { public void doOther() { .... } } SomeAndOther如何同时拥有两个SomeClass与OtherClass类别已定义好的操作?并可以多型操作?SomeAndOther可以 继承其中之一,并拥有其中之一,例如: public class SomeAndOther extends SomeClass implements IOther { private IOther other = new OtherClass(); public void doOther() { other.doOther(); } } 虽不满意,但至少解决了目前的问题,当然这边只是其中一例,毕竟C++是C++,Java是Java,两者语法并不是一对一的关系,视实际需求还可以变化 一下。 ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2467027.html,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册