由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。
结构型模式分为以下 7 种:
代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。
装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能。
外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
代理模式
- 适用场景
- 为某对象提供一个代理,用来控制对该对象的访问,从而限制,增强或修改该对象的一些特性
- aop
- 一般结构
- 抽象主题: 通过接口或者抽象类声明真实主题和代理对象实现的业务方法
- 真实主题:实现抽象主题中的具体方法
- 代理:提供与真实主题相同的接口,类内部有真实主题的引用,他可以访问,控制或者扩展真实主题的功能
- 代码实现
public class proxy_test {
public static void main(String[] args) {
proxy proxy=new proxy();
proxy.getshow();
}
}
interface title{
void show();
}
class T_title implements title{
@Override
public void show() {
System.out.println("具体主题");
}
}
class proxy{
T_title t_title;
void getshow(){
if(t_title==null){
t_title=new T_title();
}
pre();
t_title.show();
after();
}
//操作之前
void pre(){
System.out.println("前");
}
//操作之后
void after(){
System.out.println("后");
}
}
适配器模式
- 适用场景:
- 将一个类的接口转化为客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致
- 使用第三方提供组件,但组件接口定义和自己要求的接口定义不同
- 一般结构
- 目标接口:当前系统业务可以用的接口,可以是抽象类或者接口
- 适配者类:是被访问和适配的现存组件库中的组件接口。(也就是被调用的当前不能直接使用的类)
- 适配器类:作为一个转换器,通过继承或引用适配者的对象,把适配者接口转化成目标接口,让客户按目标接口的格式访问适配者。
- 代码实现
- 类适配器(通过继承实现)
public class adapter_test {
public static void main(String[] args) {
adapter adapter=new adapter();
adapter.request();
}
}
//目标类
interface target{
void request();
}
//适配者类
class adaptee{
void show(){
System.out.println("调用适配者类");
}
}
//适配器类
class adapter extends adaptee implements target{
@Override
public void request() {
show();
}
}
- 对象适配器(通过引用实现)
class ObjectAdapter implements Target
{
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void request()
{
adaptee.show();
}
}
桥接模式
- 定义:将抽象和实现分离,使他们可以独立变化
- 实现代码
//实现化角色:颜色
interface Color
{
String getColor();
}
//具体实现化角色:黄色
class Yellow implements Color
{
public String getColor()
{
return "yellow";
}
}
//具体实现化角色:红色
class Red implements Color
{
public String getColor()
{
return "red";
}
}
//抽象化角色:包
abstract class Bag
{
protected Color color;
public void setColor(Color color)
{
this.color=color;
}
public abstract String getName();
}
//扩展抽象化角色:挎包
class HandBag extends Bag
{
public String getName()
{
return color.getColor()+"HandBag";
}
}
//扩展抽象化角色:钱包
class Wallet extends Bag
{
public String getName()
{
return color.getColor()+"Wallet";
}
}
装饰模式
- 定义:在不改变现有对象结构的情况下,动态地给对象增加功能。
- 优点:
- 比继承更加灵活
- 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合
- 缺点:
- 增加了过多的子类
- 使用场景
- 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
- 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰模式却很好实现。
- 当对象的功能要求可以动态地添加,也可以再动态地撤销时。
- 一般结构: