5年働いていますが、ファサードモデルがまだわかりません。
が ファサード パターン # を共有します。デザインパターン。 ##。
適切なライフ ストーリーと実際のプロジェクト シナリオを使用してデザイン パターンを伝えます最後に、このデザイン パターンを 1 つの文で要約します。
# であることを知っています。 ##controller---servie---dao/mapper/repository
しかし、私は多くの人に、ファサード モードに精通しているかどうかを尋ねてきました。 5年も働いているのに何も知らない人もいます。 すべての開発友人は、バックエンド開発が通常:今日はLao Tianがファサードモードをご紹介します。
ファサード パターンの概要
ファサード パターン (ファサード パターン ) は、外観とも呼ばれます。パターン は、サブシステム内のインターフェイスのグループにアクセスするための統合インターフェイスを提供します。その主な特徴は、サブシステムを使いやすくするための高レベルのインターフェイスを定義しており、構造設計パターンに属していることです。 ######英語:###サブシステム内の一連のインターフェイスに統一インターフェイスを提供します。Facade は、サブシステムを使いやすくする高レベルのインターフェイスを定義します。
実際、日常のコーディング作業では、彼らは皆、意図的か非意図的かに関わらず、ファサードのパターンを多用しています。高レベルのモジュールが複数のサブシステム (3 つ以上のクラス オブジェクト) をスケジュールする必要がある場合は常に、これらのサブシステムをカプセル化する新しいクラスを意識的に作成し、高レベルのモジュールがこれらのサブシステムの関数をより簡単に間接的に呼び出せるように合理化されたインターフェイスを提供します。サブシステム。
実例
実例では、ファサード モデルに関する事例が非常にたくさんあります。
ケース 1: 用事を処理するために銀行に行くと、フロントデスクがあなたを迎えてくれます。 , そのため、あちこち歩き回ってどこにでも行く必要はありません。対応するビジネス窓口を見つけてください。このフロントスタッフがファサードモデルに相当します。
ケース 2: 家を建てるときに、請負業者がいない場合は、セメント工、電気技師、装飾業者などを自分で探さなければなりません。しかし、業者に依頼すれば、これらの作業を行う必要はなく、配線を直すために電気技師が必要であることを業者に直接伝えることができます。この請負業者はファサード モデルとして理解できます。
ケース 3: バックエンドによって開発された controller
はファサード モードとしても理解できます。たとえば、ユーザー アカウント情報を取得するには、まず UserService
をチェックして取得します。ユーザー情報を確認し、UserAccountService
ユーザー アカウント情報を確認します。
ファサード モードに適用できるシナリオ
ソフトウェア システムでは、ファサード モードは次のアプリケーション シナリオに適しています。
複雑なモジュールまたはサブシステムへの外部アクセスのためのシンプルなインターフェイスを提供します。
サブシステムの独立性を高めたい場合。
避けられない一時的な理由により、サブシステムにバグやパフォーマンス関連の問題が発生する可能性がある場合、ファサード モードを通じて高レベルのインターフェイスを提供して、クライアントとクライアント間の直接の対話を分離できます。コード汚染を防ぎます。
ファサード モードの一般的な記述方法
単純なファサードを実装するには引き続きコードを使用しますモード、なぜならデモから始めるのが一番好きなからです。
ビジネス シナリオ: 次に、3 つのサービスのそれぞれのメソッドを呼び出す必要があります:
public class ServiceA {
public void doA(){
System.out.println("do ServiceA");
}
}
public class ServiceB {
public void doB(){
System.out.println("do ServiceB");
}
}
public class ServiceC {
public void doC(){
System.out.println("do ServiceC");
}
}
ファサード モードが導入されていない場合、クライアントは次のように呼び出します:
public class Client {
public static void main(String[] args) {
ServiceA serviceA=new ServiceA();
ServiceB serviceB=new ServiceB();
ServiceC serviceC=new ServiceC();
serviceA.doA();
serviceB.doB();
serviceC.doC();
}
}
Every Second 次に、クライアント自体が多くのサービス オブジェクトを作成する必要がありますが、多くのサービスが関与する場合、このコードは非常に厄介ではないでしょうか。繰り返しのコードが多くなります。
実行結果
do ServiceA
do ServiceB
do ServiceC
ファサードモード
を追加しましょう:
public class Facade {
//是不是很像我们controller里注入各种service?
private ServiceA serviceA = new ServiceA();
private ServiceB serviceB = new ServiceB();
private ServiceC serviceC = new ServiceC();
public void doA() {
serviceA.doA();
}
public void doB() {
serviceB.doB();
}
public void doC() {
serviceC.doC();
}
}
クライアントは次のようになります:
public class Client {
public static void main(String[] args) {
//轻轻松松的搞定,只需要创建门面这个对象即可
Facade facade=new Facade();
facade.doA();
facade.doB();
facade.doC();
}
}
実行結果:
do ServiceA
do ServiceB
do ServiceC
## 結合この UML 図を使用すると、銀行のフロント デスク担当者や請負業者のケースを検討するときに、ファサード パターンを理解しやすくなります。 ファサード モードのロール上の図からわかるように、ファサード モードには主に 2 つのロールが含まれています。
外観ロール (ファサード
): ファサード ロールとも呼ばれ、システムの統合された外部インターフェイスです。 サブシステム ロール (Service
): 同時に 1 つ以上の Service
が存在できます。各 Service
は個別のクラスではなく、クラスのコレクションです。 Service
は Facade
の存在を知りません。サービスにとって、Facade
は単なる別のクライアントです (つまり、Facade
は ## です) #ServiceA、
ServiceB、
ServiceC 透過的)。
#ファサードパターンの拡張
#メリット
## システムの相互依存性を軽減する
考えてみてください、ファサードモードを使わないと、外部からのアクセスは直接サブシステムに入り、あなたが死ねば私も死ぬ、あなたが生きれば私も生きる、という強い結合関係が生まれます。強い依存関係はシステム設計の結果です。受け入れられません。ファサード パターンの出現により、この問題は非常にうまく解決されます。すべての依存関係はファサード オブジェクトにあり、サブシステムとは何の関係もありません。 ● 提高安全性
想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。
缺点
当增加子系统和扩展子系统行为时,可能容易带来未知风险。 不符合开闭原则。 某些情况下,可能违背单一职责原则
。
大神们是如何使用的
在Spring
中也是有大量使用到门面模式,比如说
org.springframework.jdbc.support.JdbcUtils
再来看看其中的方法
public static void closeConnection(@Nullable Connection con) {
con.close();
}
public static Object extractDatabaseMetaData(DataSource dataSource, DatabaseMetaDataCallback action)
throws MetaDataAccessException {
Connection con = null;
try {
con = DataSourceUtils.getConnection(dataSource);
DatabaseMetaData metaData = con.getMetaData();
if (metaData == null) {
//.....
}
return action.processMetaData(metaData);
}
}
......
都是给我封装好了方法,对于我们开发者来说,我只面向JdbcUtils
这一个类就好了,我不用去管Connection
、ResultSet
等是怎么创建的,需要的时候,我调用JdbcUtils
的对应方法即可获得对应的对象。
在Mybatis
中也是用到了门面模式,比如:
org.apache.ibatis.session.Configuration
在Configuration
中以new
开头的方法,比如:
public Executor newExecutor(Transaction transaction) {
return newExecutor(transaction, defaultExecutorType);
}
public MetaObject newMetaObject(Object object) {
return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}
public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
...
return parameterHandler;
}
public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
ResultHandler resultHandler, BoundSql boundSql) {
...
return resultSetHandler;
}
public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement){
...
}
对于调用这些方法的地方,他并不知道是怎么new
出来的对象,只管使用就行了。
在Tomcat
中也有门面模式,比如:
org.apache.catalina.connector.RequestFacade
从名字就知道它用了门面模式。它封装了非常多的request
操作,也整合了很多servlet-api
以外的内容,给用户使用提供了很大便捷。同样,Tomcat
针对Response
和Session
也封装了对应的ResponseFacade
类和StandardSessionFacade
类,感兴趣的小伙伴可以深入了解一下。
PS
:基本上所有以Facade
结尾的类,都是使用到了门面模式。
参考: Tom のデザイン パターン コース
概要
わかりました。ファサード モードについてたくさん共有しました。この記事を読んで、ファサード モードが実際には非常にシンプルであると思いましたか?また、それが仕事で使用できるかどうかを検討することもできます。面接で自慢すること。
サブシステム内の一連のインターフェイスに統一インターフェイスを提供します。Facade は、サブシステムを使いやすくする高レベルのインターフェイスを定義します。
controller
はファサード モードとしても理解できます。たとえば、ユーザー アカウント情報を取得するには、まず UserService
をチェックして取得します。ユーザー情報を確認し、UserAccountService
ユーザー アカウント情報を確認します。 ファサードモード
を追加しましょう:
ファサード
): ファサード ロールとも呼ばれ、システムの統合された外部インターフェイスです。 Service
): 同時に 1 つ以上の Service
が存在できます。各 Service
は個別のクラスではなく、クラスのコレクションです。 Service
は Facade
の存在を知りません。サービスにとって、Facade
は単なる別のクライアントです (つまり、Facade
は ## です) #ServiceA、
ServiceB、
ServiceC 透過的)。
违背单一职责原则
。Spring
中也是有大量使用到门面模式,比如说JdbcUtils
这一个类就好了,我不用去管Connection
、ResultSet
等是怎么创建的,需要的时候,我调用JdbcUtils
的对应方法即可获得对应的对象。Mybatis
中也是用到了门面模式,比如:Configuration
中以new
开头的方法,比如:new
出来的对象,只管使用就行了。Tomcat
中也有门面模式,比如:request
操作,也整合了很多servlet-api
以外的内容,给用户使用提供了很大便捷。同样,Tomcat
针对Response
和Session
也封装了对应的ResponseFacade
类和StandardSessionFacade
类,感兴趣的小伙伴可以深入了解一下。PS
:基本上所有以Facade
结尾的类,都是使用到了门面模式。以上が5年働いていますが、ファサードモデルがまだわかりません。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

HashMapは、Javaのハッシュテーブルを介してキーと値のペアストレージを実装し、そのコアはデータの位置をすばやく配置することにあります。 1.最初にキーのHashCode()メソッドを使用して、ハッシュ値を生成し、ビット操作を介して配列インデックスに変換します。 2。異なるオブジェクトは、同じハッシュ値を生成し、競合をもたらす場合があります。この時点で、ノードはリンクされたリストの形式で取り付けられています。 JDK8の後、リンクされたリストが長すぎ(デフォルトの長さ8)、効率を改善するために赤と黒の木に変換されます。 3.カスタムクラスをキーとして使用する場合、equals()およびhashcode()メソッドを書き直す必要があります。 4。ハッシュマップは容量を動的に拡大します。要素の数が容量を超え、負荷係数(デフォルト0.75)を掛けた場合、拡張して再ハッシュします。 5。ハッシュマップはスレッドセーフではなく、マルチスレッドでconcuを使用する必要があります

Javaのキャラクターエンコーディングの問題に対処するために、重要なのは、各ステップで使用されるエンコードを明確に指定することです。 1.テキストを読み書きするときは常にエンコードを指定し、inputstreamreaderとoutputStreamWriterを使用し、明示的な文字セットを渡して、システムのデフォルトエンコードに依存しないようにします。 2.ネットワーク境界で文字列を処理するときに両端が一貫していることを確認し、正しいコンテンツタイプのヘッダーを設定し、ライブラリでエンコードを明示的に指定します。 3. string.getBytes()およびNewString(byte [])を注意して使用し、プラットフォームの違いによって引き起こされるデータの破損を避けるために、常に手動でstardantcharsets.utf_8を指定します。要するに、

Javaでは、Defaultのデフォルトソートルールを内部的に定義するためにAcparableが使用され、コンパレータを使用して複数のソートロジックを外部から定義します。 1.Comparableは、クラス自体によって実装されるインターフェイスです。比較()メソッドを書き換えることにより、自然な順序を定義します。弦や整数など、固定および最も一般的に使用されるソートメソッドを備えたクラスに適しています。 2。Comparatorは、同じクラスに複数の並べ替え方法が必要な状況に適した、Compare()メソッドを介して実装された外部定義の機能インターフェイスであり、クラスソースコードを変更できない、またはソートロジックが変更されることが多い場合があります。 2つの違いは、比較可能がソートロジックを定義するだけで、クラス自体を変更する必要があることですが、比較して

Javaにはマップを通過する3つの一般的な方法があります。1。エントリセットを使用してキーと値を同時に取得します。これは、ほとんどのシナリオに適しています。 2。キーセットまたは値をそれぞれキーまたは値を通過する。 3. Java8のForeachを使用して、コード構造を簡素化します。 EntrySetは、すべてのキー値ペアを含むセットを返し、各ループはキーと値に頻繁にアクセスするのに適したMap.entryオブジェクトを取得します。キーまたは値のみが必要な場合は、それぞれkeyset()またはvalues()を呼び出すことができます。または、キーを横断するときにmap.get(key)を介して値を取得できます。 Java 8はForeachを使用できます((key、value) - &gt

Injava、thestatickeywordmeansameansmestotheclassit self、nottointances.staticvariablesaresharedacrossallinstancesは、Objedcreationを使用して、GlobalTrackingorconconstants.StaticMethododsodsodsoperateateClasslevel

JDBCトランザクションを正しく処理するには、最初に自動コミットモードをオフにし、次に複数の操作を実行し、結果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開始します。 2。挿入や更新など、複数のSQL操作を実行します。 3。すべての操作が成功した場合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場合はconn.rollback()を呼び出します。同時に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設定して部分的なロールバックを達成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお勧めします。

tosetjava_homeonwindows、firstlocatethejdkinstallationpath(例:c:\ programfiles \ java \ jdk-17)、thencreateSystemenvironmentvaria blenamedjava_homewiththatpath.next、updatethepathvariablebyadding%java \ _home%\ bin、andverifythesetusingingingjava-versionandjavac-v

仮想スレッドには、非常に並行したシナリオとIO集約型シナリオに大きなパフォーマンスの利点がありますが、テスト方法と適用可能なシナリオに注意を払う必要があります。 1.正しいテストでは、実際のビジネス、特にIOブロッキングシナリオをシミュレートし、JMHやガトリングなどのツールを使用してプラットフォームスレッドを比較する必要があります。 2。スループットのギャップは明らかであり、スケジューリングがより軽量で効率的であるため、100,000の同時リクエストよりも数倍から10倍高くなる可能性があります。 3。テスト中に、盲目的に高い並行性数を追求し、非ブロッキングIOモデルに適応し、レイテンシやGCなどの監視インジケーターに注意を払う必要があります。 4.実際のアプリケーションでは、Webバックエンド、非同期タスク処理、および多数の同時のIOシナリオに適していますが、CPU集約型タスクはプラットフォームスレッドまたはForkjoinpoolに依然として適しています。
