栄光の王からデザインモード(デューティチェーン)を参照してください。
I.はじめに
栄光の王、7ダンの合計は、ブロンズ、シルバー、ゴールド、プラチナ、ダイヤモンド、スター八尾、王でした。モードを予選、それぞれがあなたはそれが星を失っ逆にスターを取得することができますゲームに勝ちます。リンクは、星の数が一定レベルに達したときに、あるダンを用いて得られた星の数は、システムは、対応するダンと一致します。
II。モードモチベーション
多くの場合、要求は、複数を処理することができます。多くのアプリケーションでは、オブジェクトを扱うことができる、と彼らはチェーンに沿って要求を渡し、チェーンを構成し、このチェーンは、責任の連鎖と呼ばれています。
デューティチェーンは、一方向チェーンに沿って要求を渡すために、すなわち、直線、環状、または木、最も一般的なデューティ鎖は直鎖状であってもよいです。リクエストのチェーン内の各オブジェクトは、チェーンに編成することができるデューティチェーン要求による処理によって処理され、要求、連鎖移動沿っ鎖の対応するハンドラによって処理される要求は、クライアントがない必要があります懸念や要望が要求された処理の詳細を提供するために、単純にチェーンにリクエストを送信します。リクエストのハンドラ送信者とデカップリングの要求モチベーションのChain of Responsibilityパターンです、
III。Chain of Responsibilityパターン
デューティチェーン(Chain of Responsibilityパターン):避け送信側と受信側の要求は、複数のオブジェクトが、チェーンを形成し、要求がチェーンに沿って伝送されるこれらのオブジェクトを接続するための要求を受信する可能性があるように、互いに結合されています。一つのオブジェクトまではこれまでのところ、それを処理します。これは、オブジェクトの行動パターンです
デューティ・チェーンの使用シナリオ:
以下の例のデューティチェーンで使用することができます。
特定のターゲットの実行時間は自動で決定されたリクエストを処理し、■複数のオブジェクトが同じ要求を処理することができ、クライアントは単に要求チェーンに提出、処理されるように要求し、それがどのように扱われるか、誰を気にせず
■明示的に受信者を指定せずに、一つに複数のオブジェクトによって要求を提出します。送信者と依頼者のデカップリング要求ハンドラは、要求は、対応する処理を求めていることで、チェーンに沿って渡される
動的な要求を指定にオブジェクトのセットを処理します■。また、チェーンハンドラ間の順序を変更することができます
フォントの色=ブルーサイズ= 2の顔 =「 のTimes New Roman」>関与デューティチェーンの設計原理は以下のとおりです。
★オブジェクトの間の疎結合の相互作用設計するために努力する
クラスが唯一の変更原因なければならない理由★
★ソフトウェアエンティティを延長しなければならないが変更することはできません(クラスで増加要求処理システムを、唯一のクライアントができ、再ビルド鎖)
図デューティチェーン一般クラス
:に係るロールデューティチェーン
次の役割を含むデューティチェーン:
ハンドラ(抽象プロセッサ)
一般要求モードを処理する別の特定のハンドラに起因異なる、抽象クラスとして設計された処理要求へのインターフェースを定義するための抽象化、したがって、その中に抽象要求の処理方法を定義しました。家庭又はハンドラハンドラのそれぞれので、したがって、家庭への参照として、抽象プロセスでのオブジェクトタイプ(抽象ハンドラ種類)を定義します。プロセスは、一つに接続することができストランドこの参照により、
ConcreteHandler(具体的な処理クラス)
具体的な処理クラスはサブクラスの抽象クラスであり、それは特定のハンドラクラスで定義された抽象要求抽象ハンドラを達成するために、ユーザの要求を処理することができ方法を処理して、要求の処理に先立っては、対応する権限を処理するかどうかを確認するための判断を必要とする、要求は転送し、それの取扱い、または後継者への要求を処理できる場合は、チェーンの次のオブジェクトへのアクセスを特定の処理クラスで要求に転送
クライアント(クライアントカテゴリ)**
要求処理と配信プロセスの要求の詳細を気にすることなく、オブジェクトのチェーンに提案されている最初の要求に対する顧客のクラス、クラスの顧客ケアチェーンの唯一のソースを、
デューティチェーン利点:
⑴結合を減少させる。
⑵簡素化オブジェクトを相互接続:唯一の基準点後継維持するために、処理対象の要求
サブジェクトに割り当て⑶強化柔軟性責任:チェーンを実行して動的に追加または要求の職務を増加または変化させるために修飾。
⑷。簡単にリクエストを処理する新しいクラスを追加します。
デューティチェーンの欠点は:
⑴要求を受信しなければならないことを保証することはできません。受信者が明確ではないが、それは特定のを確認するために処理することができない
⑵責任の連鎖を長すぎるため、システムのパフォーマンスに影響を与えます。不適切なチェーンは無限ループを構築することができます。
IV。構造図
V.設計クラス図
ブロンズ、シルバー、八尾、王スター:プレゼンテーション、3ダン・ダンのための栄光7速記の王を容易にするため。星の数がグレードブロンズに対応し、15未満であり、銀の等級の星の数に相当する15〜35;グレードはスター八尾35〜55の星の数に対応する、55以上の星、王は(X-として表現しました55)星。
VI。コードの実装
リクエストクラスを作成します(StarRatingRequest)
package com.chainOfRes.request;
/*
* 创建请求类,由客户端指定其属性
* @param playerName玩家名称
* @param starNumber星的数量
*/
public class StarRatingRequest {
private String playerName;
private int starNumber;
public StarRatingRequest(String _playerName,int _starNumber) {
this.playerName = _playerName;
this.starNumber = _starNumber;
}
public String getPlayerName() {
return playerName;
}
public void setPlayerName(String playerName) {
this.playerName = playerName;
}
public int getStarNumber() {
return starNumber;
}
public void setStarNumber(int starNumber) {
this.starNumber = starNumber;
}
}
抽象ハンドラクラスを作成します(GameLevel)
package com.chainOfRes.Chain;
import com.chainOfRes.request.StarRatingRequest;
/*
* 创建抽象处理者类
*/
public abstract class GameLevel {
//定义自类型
protected GameLevel successor;
//接收下一家对象
public void setSuccessor(GameLevel successor) {
this.successor = successor;
}
//抽象处理方法
public abstract void handleRequest(StarRatingRequest request);
}
特定のハンドラクラスを作成します(ブロンズ)
package com.chainOfRes.Chain;
import com.chainOfRes.request.StarRatingRequest;
/*
* 创建具体处理者类
* 当客户端传入的星数少于15,由该对象处理,否则传递给客户端指定的下家
*/
public class Bronze extends GameLevel {
@Override
public void handleRequest(StarRatingRequest request) {
if(request.getStarNumber() < 15) {
System.out.println("玩家[" + request.getPlayerName() + "]统计为"
+ request.getStarNumber() + "颗星,评定为等级:★青铜");
}else {
if(this.successor != null) {
this.successor.handleRequest(request);
}
}
}
}
具体的な処理クラス(シルバー)を作成します。
package com.chainOfRes.Chain;
import com.chainOfRes.request.StarRatingRequest;
/*
* 创建具体处理者类
* 当客户端传入的星数在15-35,由该对象处理,否则传递给客户端指定的下家
*/
public class Silver extends GameLevel {
@Override
public void handleRequest(StarRatingRequest request) {
if(request.getStarNumber() < 35) {
System.out.println("玩家[" + request.getPlayerName()
+ "]统计为" + request.getStarNumber() + "颗星,评定为等级:★白银");
}else {
if(this.successor != null) {
this.successor.handleRequest(request);
}
}
}
}
具体的な処理クラスを作成します(ロイヤリティ)
package com.chainOfRes.Chain;
import com.chainOfRes.request.StarRatingRequest;
/*
* 创建具体处理者类
* 当客户端传入的星数在35-55,由该对象处理,否则评定为王者段位
*/
public class Royalty extends GameLevel {
@Override
public void handleRequest(StarRatingRequest request) {
if(request.getStarNumber() < 55) {
System.out.println("玩家[" + request.getPlayerName() + "统计为"
+ request.getStarNumber() + "颗星,评定为等级:★星耀");
}else {
System.out.println("玩家[" + request.getPlayerName()
+ "]统计为" + request.getStarNumber()
+ "颗星,评定为等级:★王者" + (request.getStarNumber()-55) + "星");
}
}
}
テストクラスのクライアント(クライアントクラス)を作成します。
package com.chainOfRes.Client;
import com.chainOfRes.Chain.Bronze;
import com.chainOfRes.Chain.GameLevel;
import com.chainOfRes.Chain.Royalty;
import com.chainOfRes.Chain.Silver;
import com.chainOfRes.request.StarRatingRequest;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.实例化具体处理者对象
GameLevel objBronze,objSilver,objRoyalty;
objBronze = new Bronze();
objSilver = new Silver();
objRoyalty = new Royalty();
//2.为具体处理者配置下一个处理,形成链
objBronze.setSuccessor(objSilver);
objSilver.setSuccessor(objRoyalty);
//3.实例化请求对象
StarRatingRequest sr0 = new StarRatingRequest("阿肥",52);
//4.将请求发送给链的初始对象
objBronze.handleRequest(sr0);
StarRatingRequest sr1 = new StarRatingRequest("妙乌",58);
objBronze.handleRequest(sr1);
StarRatingRequest sr2 = new StarRatingRequest("蒸血Stalk",32);
objBronze.handleRequest(sr2);
StarRatingRequest sr3 = new StarRatingRequest("文轩",10);
objBronze.handleRequest(sr3);
}
}
結果: