代理(Proxy)模式 ,桥梁(Bridge)模式

时间:2021-05-22 21:24:30

一:代理模式

1 根据名字我们就可以理解为:代替别人管理

2 什么情况下使用代理模式呢?

在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。

结构图:

代理(Proxy)模式 ,桥梁(Bridge)模式

3 我们一卖书为例:

 package com.lovo.Proxy;
/**
*
* @author acer
*
*/
public interface IBook {
public void sailBook(); }
 package com.lovo.Proxy;
/**
*
* @author acer
*
*/
public class RealSubject implements IBook { @Override
public void sailBook() {
System.out.println("卖书了");
} }
 package com.lovo.Proxy;
/**
*
* @author acer
*
*/
public class MyProxy implements IBook {
private RealSubject realSubject; public MyProxy(RealSubject realSubject) {
super();
this.realSubject = realSubject;
} @Override
public void sailBook() {
realSubject.sailBook(); } }
 package com.lovo.Proxy;
/**
*
* @author acer
*
*/
public class Test { public static void main(String[] args) {
MyProxy myProxy=new MyProxy(new RealSubject());
myProxy.sailBook(); } }

二:桥梁模式

主要的一句话就是  :将抽象部分与他的实现部分分离,使他们都可以独立的变化!现实指的是抽象类和他派生的类用来实现自己的对象!

我们来举个例子吧!

结构图:

代理(Proxy)模式 ,桥梁(Bridge)模式

比如:客户需要我们画出多种图形,并且可以用多种线条来画这些图形;

这里面变化的是图形,线条,那么我们就可以使用两个接口,让子类来实现这两个接!让子类来实现画出怎样的图像来!

首先我们写个画线条的接口:

 package com.lovo.Bridge.two;

 public interface IDraw {
public void doDraw(); }

画图形接口:

 package com.lovo.Bridge.two;

 public interface IShape {
public void myDraw(); }

各种图形的类:// 矩形 圆

 package com.lovo.Bridge.two;

 public class Rectangular implements IShape {
private int width;
private int height;
private IDraw draw; public Rectangular(int width, int height, IDraw draw) {
super();
this.width = width;
this.height = height;
this.draw = draw;
} public int getWidth() {
return width;
} public void setWidth(int width) {
this.width = width;
} public int getHeight() {
return height;
} public void setHeight(int height) {
this.height = height;
} public IDraw getDraw() {
return draw;
} public void setDraw(IDraw draw) {
this.draw = draw;
} @Override
public void myDraw() {
System.out.println("画矩形:长:"+this.width+"高:"+this.height);
draw.doDraw(); } }
 package com.lovo.Bridge.two;

 public class Round implements IShape{
private int r;
private int x;
private int y;
private IDraw draw; public Round(int r, int x, int y, IDraw draw) {
super();
this.r = r;
this.x = x;
this.y = y;
this.draw = draw;
} public int getR() {
return r;
} public void setR(int r) {
this.r = r;
} public int getX() {
return x;
} public void setX(int x) {
this.x = x;
} public int getY() {
return y;
} public void setY(int y) {
this.y = y;
} public IDraw getDraw() {
return draw;
} public void setDraw(IDraw draw) {
this.draw = draw;
} @Override
public void myDraw() {
System.out.println("画圆:半径:"+this.r +"圆心在("+this.x+","+this.y+")");
draw.doDraw(); } }

在写两个线条的类://实线  虚线

 package com.lovo.Bridge.two;

 public class Dotted implements IDraw{

     @Override
public void doDraw() {
System.out.println("画虚线");
} }
 package com.lovo.Bridge.two;

 public class Solid implements IDraw{

     @Override
public void doDraw() {
System.out.println("画实线");
} }

最后来个测试类:

 package com.lovo.Bridge.two;

 public class Test {

     public static void main(String[] args) {
IDraw d=new Solid();
IShape s=new Rectangular(100, 50, d);
s.myDraw();
} }

对于这些设计模式  其实我自己也不太搞得清楚的,只是因为最近在学这个!算是做一些记录吧!