java设计模式-接⼝型模式
接⼝型模式
接⼝与抽象类的区别:
⼀个类可以实现(implements)任意多个接⼝,但只能继承(extend)⼀个抽象类。⼀个抽象类可有⾮抽象⽅法,可以定义构造器,接⼝的所有⽅法都是抽象的。 接⼝只能声明static final 常量,因为⼀般成员变量⽆法实例化。抽象类的⽅法可以是private public protected 或者默认的package接⼝的⽅法都是public。
适配器模式
类适配器,对象适配器
类适配器是客户类有⼀个接⼝规范的情况下可⽤,此时适配类只需作为功能类的⼦类,并实现接⼝并可,直接⽤功能类实现了客户类的要求,⽽对象适配类是在客户类没有提供接⼝的情况下⽤的,适配类作为客户类的⼦类,并在其中实例化⼀个功能类的对象,并调⽤此对象的⽅法实现适配,故称对象适配。
//客户类
public class Customer
{
public virtual int CustomMethod();
}
//已有功能类
public class Action
{
public Action()...{};
public int ActionMethod()
{
//do something here
}
}
//对象适配器
public class AdapterClass extents Customer
{
private Action ac;
public AdapterClass()...{};
public override void CustumMethod()
{
retun ac.ActionMethod();
}
}
/
/客户接⼝
public Interface ICustomer
{
public int CustomMethod();
}
//已有功能类
public class Action
{
public Action(){};
public int ActionMethod()
{
/
/do something here
}
java中常用的设计模式有哪些}
//类适配器
public class AdapterClass extents Action implements ICutomer
{
public AdapterClass(){};
public void CustumMethod()
{
retun ActionMethod();
}
}
个⼈认为,在java中,由于不可多继承故存在类适配器与对象适配器的的区别。在C++中区别不⼤(个⼈见解,若有错海涵)。
外观模式
Facade(外观)模式为⼦系统中的各类(或结构与⽅法)提供⼀个简明⼀致的界⾯,隐藏⼦系统的复杂性,使⼦系统更加容易使⽤。 Facade模式概述
实际应⽤中,我们在对付⼀些⽼旧的code(尤其是将C的代码转成C++代码)或者即便不是⽼旧code,但涉及多个⼦系统时,除了重写全部代码 (对于⽼旧code⽽⾔),我们还可能采⽤这样⼀种策略:重新进⾏类的设计,将原来分散在源码中的类/结构及⽅法重新组合,形成新的、统⼀的接⼝, 供上层应⽤使⽤。
这在某种意义上与Adapter及Proxy有类似之处,但是,Proxy(代理)注重在为Client-Subject提供⼀个访问的中间层,如CORBA可为应 ⽤程序提供透明访问⽀持,使应⽤程序⽆需去考虑平台及⽹络造成的差异及其它诸多技术细节;Adapter(适配器)注重对接⼝的转换与调整;⽽
Facade所⾯对的往往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统⼀的接⼝/
界⾯。
Facade模式应⽤
在遇到以下情况使⽤Facade模式:
  1、当你要为⼀个复杂⼦系统提供⼀个简单接⼝时。⼦系统往往因为不断演化⽽变得越来越复杂。⼤多数模式使⽤时都会产⽣更多更⼩的类。这使得⼦系统更具可重⽤性,也更容易对⼦系统进⾏定制,但这也给那些不需要定制⼦系统的⽤户带来⼀些使⽤上的困难。Facade 可以提供⼀个简单的缺省视图,这⼀视图对⼤多数⽤户来说已经⾜够,⽽那些需要更多的可定制性的⽤户可以越过Facade层。
  2、客户程序与抽象类的实现部分之间存在着很⼤的依赖性。引⼊Facade将这个⼦系统与客户以及其他的⼦系统分离,可以提⾼⼦系统的独⽴性和可移植性。
  3、当你需要构建⼀个层次结构的⼦系统时,使⽤Facade模式定义⼦系统中每层的⼊⼝点,如果⼦系统之间是相互依赖的,你可以让它们仅通过Facade进⾏通讯,从⽽简化了它们之间的依赖关系。
Facade模式优缺点
Facade模式有下⾯⼀些优点:
  1、它对客户屏蔽⼦系统组件,因⽽减少了客户处理的对象的数⽬并使得⼦系统使⽤起来更加⽅便。
  2、它实现了⼦系统与客户之间的松耦合关系,⽽⼦系统内部的功能组件往往是紧耦合的。松耦合关系使得⼦系统的组件变化不会影响到它的客户。Facade模式有助于建⽴层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。这⼀点在客户程序与⼦系统是分别实现的时候尤为重要。在⼤型软件系统中降低编译依赖性⾄关重要。在⼦系统类改变时,希望尽量减少重编译⼯作以节省时间。⽤Facade可以降低编译依赖性,限制重要系统中较⼩的变化所需的重编译⼯作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译⼀个⼦系统⼀般不需要编译所有其他的⼦系统。
合成模式
//转载⾃
将对象组合成树形结构以表⽰‘部分-整体’的层次结构。组合模式使得⽤户对单个对象和组合对象的使⽤具有⼀致性 1.组合模式的例⼦
import java.util.ArrayList;
import java.util.List;
public class ComponentDemo {
public abstract class Component {
String name;
public abstract void add(Component c);
public abstract void remove(Component c);
public abstract void eachChild();
}
// 组合部件类
public class Leaf extends Component {
// 叶⼦节点不具备添加的能⼒,所以不实现
@Override
public void add(Component c) {
// TODO Auto-generated method stub
System.out.println("");
}
// 叶⼦节点不具备添加的能⼒必然也不能删除
@Override
public void remove(Component c) {
// TODO Auto-generated method stub
System.out.println("");
}
// 叶⼦节点没有⼦节点所以显⽰⾃⼰的执⾏结果
@Override
public void eachChild() {
/
/ TODO Auto-generated method stub
System.out.println(name + "执⾏了");
}
}
// 组合类
public class Composite extends Component {
// ⽤来保存节点的⼦节点
// ⽤来保存节点的⼦节点
List<Component> list = new ArrayList<Component>();
// 添加节点添加部件
@Override
public void add(Component c) {
// TODO Auto-generated method stub
list.add(c);
}
// 删除节点删除部件
@Override
public void remove(Component c) {
// TODO Auto-generated method stub
}
// 遍历⼦节点
@Override
public void eachChild() {
// TODO Auto-generated method stub
System.out.println(name + "执⾏了");
for (Component c : list) {
c.eachChild();
}
}
}
public static void main(String[] args) {
ComponentDemo demo = new ComponentDemo();
/
/ 构造根节点
Composite rootComposite = w Composite();
rootComposite.name = "根节点";
// 左节点
Composite compositeLeft = w Composite();
compositeLeft.name = "左节点";
// 构建右节点,添加两个叶⼦⼏点,也就是⼦部件
Composite compositeRight = w Composite();
compositeRight.name = "右节点";
Leaf leaf1 = w Leaf();
leaf1.name = "右-⼦节点1";
Leaf leaf2 = w Leaf();
leaf2.name = "右-⼦节点2";
compositeRight.add(leaf1);
compositeRight.add(leaf2);
// 左右节点加⼊根节点
rootComposite.add(compositeRight);
rootComposite.add(compositeLeft);
// 遍历组合部件
rootComposite.eachChild();
}
}
3.什么情况下使⽤组合模式
引⽤⼤话设计模式的⽚段:“当发现需求中是体现部分与整体层次结构时,以及你希望⽤户可以忽略组合对象与单个对象的不同,统⼀地使⽤组合结构中的所有对象时,就应该考虑组合模式了。”
桥接模式
//转⾃
暂未理解照搬
public interface Qiao {
//⽬的地B
void targetAreaB();
}
/**
* ⽬的地B1
*/
public class AreaB1 implements Qiao {
@Override
public void targetAreaB() {
System.out.println("我要去B1");
}
}
/**
* ⽬的地B2
*/
public class AreaB2 implements Qiao {
@Override
public void targetAreaB() {
System.out.println("我要去B2");
}
}
/**
* ⽬的地B3
*/
public class AreaB3 implements Qiao {
@Override
public void targetAreaB() {
System.out.println("我要去B3");
}
}
public abstract class AreaA {
//引⽤桥接⼝
Qiao qiao;
//来源地
abstract void fromAreaA();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。