ファサードのデザインパターン

他のパターン説明を読んでください

問題


複雑なシステムのサブシステムの依存関係とそれらの間の情報交換を最小限に抑えるため。

説明


複雑なシステムを設計するとき、いわゆる 複雑なシステムがより小さくシンプルなサブシステムに分割される分解原理。 さらに、分解レベル(その深さ)は、設計者のみが決定します。 このアプローチのおかげで、システムの個々のコンポーネントを個別に開発し、統合することができます。 ただし、一見して明らかな問題が発生します-システムモジュールの高い接続性。 これは主に、モジュールが相互に交換する大量の情報に現れます。 さらに、このような通信では、一部のモジュールには他のモジュールの性質に関する十分な情報が必要です。

したがって、サブシステム間の依存関係を最小限に抑え、サブシステム間で送信される情報量を削減することは、主要な設計タスクの1つです。

この問題を解決する1つの方法は、「ファサード」パターンを使用することです。

Facadeパターンは、サブシステムの一連のインターフェースではなく、統合されたインターフェースを提供します。 ファサードは、より高いレベルのインターフェースを定義します。
最初のものは、サブシステムの使用を簡素化します。

簡単に言うと、「ファサード」は、複雑なサブシステムを操作するための高レベルの操作セットを蓄積する特定のオブジェクトにすぎません。 ファサードは、このサブシステムの機能を実装するクラスを集約しますが、それらを隠しません。 もちろん、必要な場合、クライアントはサブシステムのクラスへの下位レベルのアクセスを失わないことを理解することが重要です。 ファサードは、サブシステムでの一部の操作の実装を簡素化しますが、クライアントでの使用を強制しません。

実用的なタスク


「ファサード」パターンを使用して、ユーザー認証サブシステムへの統合されたインターフェイスを実装します。 承認サブシステム自体(この例では)は確かに「複雑なシステム」のふりをしていませんが、パターンの主な利点を明確に示しています。

クラス図


チャートを検討してください。 わかりやすくするために、認可サブシステムのフレームは長方形で強調表示されています。 Facade Authorizatorは、サブシステムを操作するための統合インターフェースをクライアントに提供します。 この場合、これは1つの方法にすぎません-authorizate()ですが、もっと多くの方法があります。 同時に、クライアントはファサードを使用してサブシステムを操作し、それを構成するクラスを直接使用できます。 認証プロセス自体は非常に簡単です。 ユーザー名に基づいて、データベース内の対応するレコードがDBインターフェイスを介して検索されます。 次に、見つかったエントリのパスワードが、ユーザーが指定したパスワードと比較されます。


C#実装


実装コードにはPgSQLDBクラスはありません
using System;
using System.Collections. Generic ;
using System.Linq;
using System.Text;
using System.Security;

namespace Facade
{
//
abstract class User
{
protected string username;
protected string passwd;

public abstract string getUserRole();

public string getPasswdHash()
{
// - .
// , -
return passwd.GetHashCode().ToString();
}
}

// , -
class DefaultUser : User
{
public DefaultUser( string username, string passwd)
{
this .username = username;
this .passwd = passwd;
}

public override string getUserRole()
{
return "DEFAULT_USER" ;
}
}

// ,
class Administrator : User
{
public Administrator( string username, string passwd)
{
this .username = username;
this .passwd = passwd;
}

public override string getUserRole()
{
return "ADMINISTRATOR" ;
}

}

//
interface DB
{
User search( string username);
}

// SQLite
class SQLiteDB : DB
{
public SQLiteDB( string filename)
{
//
}


public User search( string username)
{
//
throw new NotImplementedException();
}
}

// -
class Authorizator
{
public Authorizator()
{
//
}

//
public void authorizate( string username, string passwd)
{
DB db = new SQLiteDB( "db.sqlite" );
User user = db.search(username);
if (user.getPasswdHash() == passwd)
{
// ,
}
else
{
// -
throw new SecurityException( "Wrong password or username!" );
}
}
}

class Program
{
static void Main( string [] args)
{
//
string username = "Vasya" ;
string passwd = "qwerty" .GetHashCode().ToString();

Authorizator auth = new Authorizator();
try
{
auth.authorizate(username, passwd);
}
catch (SecurityException ex)
{
//
}
}
}
}

* This source code was highlighted with Source Code Highlighter .

PS :私にとってはうまくいきませんか?

Source: https://habr.com/ru/post/J87110/


All Articles