プロキシモード:
いくつかの理由は、オブジェクトへのアクセスを制御するプロキシを提供することを目的とする必要があります。この場合、オブジェクトは、適合しない、またはアクセスとターゲットオブジェクトとの間の仲介者として、ターゲット・オブジェクトへのプロキシオブジェクトを直接参照にアクセスすることはできません。
(クラスメソッドの前と後にそのメソッドを追加することができます)
の主な役割の委任モデル次のとおりです。
- 抽象トピック(主題)カテゴリ:実際のビジネスの方法やテーマインタフェースまたは抽象クラス宣言によって達成プロキシオブジェクト。
- レアルテーマ(実物)カテゴリ:抽象特定のビジネストピックを達成、実際のオブジェクトは、プロキシオブジェクトによって表され、オブジェクトは究極の基準となります。
- プロキシ(代理)クラス:実際のテーマと同じインタフェースを提供し、内部が実際の被写体への参照が含まれ、それは、アクセス制御、または実際のテーマの機能を拡張することができます。
package proxy;
public class ProxyTest
{
public static void main(String[] args)
{
Proxy proxy=new Proxy();
proxy.Request();
}
}
//抽象主题
interface Subject
{
void Request();
}
//真实主题
class RealSubject implements Subject
{
public void Request()
{
System.out.println("访问真实主题方法...");
}
}
//代理
class Proxy implements Subject
{
private RealSubject realSubject;
public void Request()
{
if (realSubject==null)
{
realSubject=new RealSubject();
}
preRequest();
realSubject.Request();
postRequest();
}
public void preRequest()
{
System.out.println("访问真实主题之前的预处理。");
}
public void postRequest()
{
System.out.println("访问真实主题之后的后续处理。");
}
}
装飾的なパターン:
装飾的なパターンは、主に次の役割が含まれています。
- 抽象コンポーネント(部品)の役割:追加の責任を受信する準備ができてオブジェクトを調節するために抽象インタフェースを定義します。
- 特定のコンポーネント(コンクリートコンポーネント)役割:装飾的な役割によって、その責任の一部を追加し、抽象コンポーネントを達成します。
- 抽象装飾(デコレータ)役割:抽象メンバを継承し、そして特定の部材の例を含む、特定のメンバ関数は、そのサブクラスによって拡張することができます。
- 具体的な装飾(ConcreteDecorator)役割:実装依存方法抽象的な装飾、および特定のメンバーオブジェクトに追加の責任を追加します。
package decorator;
public class DecoratorPattern
{
public static void main(String[] args)
{
Component p=new ConcreteComponent();
p.operation();
System.out.println("---------------------------------");
Component d=new ConcreteDecorator(p);
d.operation();
}
}
//抽象构件角色
interface Component
{
public void operation();
}
//具体构件角色
class ConcreteComponent implements Component
{
public ConcreteComponent()
{
System.out.println("创建具体构件角色");
}
public void operation()
{
System.out.println("调用具体构件角色的方法operation()");
}
}
//抽象装饰角色
class Decorator implements Component
{
private Component component;
public Decorator(Component component)
{
this.component=component;
}
public void operation()
{
component.operation();
}
}
//具体装饰角色
class ConcreteDecorator extends Decorator
{
public ConcreteDecorator(Component component)
{
super(component);
}
public void operation()
{
super.operation();
addedFunction();
}
public void addedFunction()
{
System.out.println("为具体构件角色增加额外的功能addedFunction()");
}
}
装飾モードとプロキシモードの違い:動的な装飾的なパターンに注意がオブジェクトのメソッドを追加しますが、プロキシモードでは、複数のオブジェクトの具体的な情報を隠されているオブジェクトへのアクセスを制御心配です。