if和else的难解难分
実際のプログラミングでは、我々は常に私たちが事を解決するための様々な枝のヘルプたちを、どんなに種類であれば、他のニーズに何をすべきかを決定するためのロジックの多くを必要としますか?答えは、我々は唯一の意志、サポートデザインパターン、または激しいと時間のかかるメンテナンスに大きなニーズがあり、デザインパターンは、複雑なシステムのため、凝集、デカップリング、優れたパッケージであり、Java用、必ずしもではありませんボディアンダーランは、次のことがあれば、他を減らすためにいくつかのブロガーの巧妙な方法をまとめたものです。
应用场景
車ネットワークプロジェクトは、このような駆動モータのデータ、エンジンデータ、車両の位置データ(GPS)、警報データパケット、のような様々な種類の異なるパケット、車についての各種データを受信する私達これは、データパケットの異なるタイプを表す列挙を定義します。
枚举
メッセージ列挙MsgTypeEnum
public enum MsgTypeEnum {
/**
* 驱动电机数据
*/
DRIVE_MOTOR,
/**
* 发动机数据
*/
ENGINE,
/**
* 车辆位置数据
*/
VEHICLE_POSITION,
/**
* 报警数据
*/
ALARM
}
メッセージクラスをデコードMsgDecoder
public class MsgDecoder {
/**
* 解码消息体
* @param msgTypeEnum 消息类型
* @return 协议具体类型
*/
public String decodeMsg(MsgTypeEnum msgTypeEnum) {
//开始解析并存储消息
switch (msgTypeEnum) {
case DRIVE_MOTOR:
return "驱动电机数据";
case ENGINE:
return "发动机数据";
case VEHICLE_POSITION:
return "车辆位置数据";
case ALARM:
return "报警数据";
default:
return null;
}
}
あなたはコードが(下の自己認識)非常にきれいで、カザフスタンで見ることができ、それがあれば、他に置き換え言われたのと同じです、はい、同じことは、何ら変わり、コードも非常に爽やかではありませんが、これは解読の普通の4種類であります彼はメッセージの種類が一緒に10以上、コード羅として多くとして行うなら、それはより多くの「リフレッシュ」されていませんか?私たちは、自動車部品の多くは、完全に私たちが列挙を改善するために、このメソッドを使用しているためにそれらを記述するために、メッセージの種類がたくさんあることを知っています。
パブリックインターフェイスクラスデコーダ
public interface Decoder {
/**
* 解码方法
*/
String decode();
}
改善列挙型クラスMsgTypeEnum
public enum MsgTypeEnum implements Decoder {
/**
* 驱动电机数据
*/
DRIVE_MOTOR{
@Override
public String decode() {
return "驱动电机数据";
}
},
/**
* 发动机数据
*/
ENGINE{
@Override
public String decode() {
return "发动机数据";
}
},
/**
* 车辆位置数据
*/
VEHICLE_POSITION{
@Override
public String decode() {
return "车辆位置数据";
}
},
/**
* 报警数据
*/
ALARM{
@Override
public String decode() {
return "报警数据";
}
}
}
改善列挙型クラスMsgDecoder
public class MsgDecoder {
/**
* 解码消息体
* @param msgTypeEnum 消息类型
* @return 协议具体类型
*/
public String decodeMsg(MsgTypeEnum msgTypeEnum) {
return MsgTypeEnum.valueOf(msgTypeEnum.toString()).decode();
}
}
最良のサービスコードが改善されたクラスの列挙メッセージMsgTypeEnumを達成していることが分かる、「自動」のメソッドで復号化のみカテゴリMsgDecoderのvalueOf列挙型の決意であり、これはクラスMsgDecoderを低減し圧力、スイッチ/ケース(場合/他)も解散したと述べたが、後の復号メッセージの種は、多様性に寛容で、なぜクラスを増加させた場合MsgTypeEnumメッセージ列挙は、肥大化になるのだろうか?列挙方法が適切ではないが、あまりの種類の判断、または推奨、すべての後、列挙が「finalクラス、」で、他のクラスが同じ性質を持っていないので、彼は他のクラスを使用するより効率的です。
列挙はまだそれを行うにはどのような方法があると、収まらないので、工場の設計パターンを変換する方法で見てみましょうは、上記の方法です。
工厂模式
パブリックインターフェイスクラスデコーダ
public interface Decoder {
/**
* 解码方法
*/
String decode();
}
メッセージ列挙MsgTypeEnum
public enum MsgTypeEnum {
/**
* 驱动电机数据
*/
DRIVE_MOTOR,
/**
* 发动机数据
*/
ENGINE,
/**
* 车辆位置数据
*/
VEHICLE_POSITION,
/**
* 报警数据
*/
ALARM
}
様々なメッセージタイプ(説明の便宜のために、それが一緒に表示されている、実際には4つのクラス)
//报警数据
public class Alarm implements Decoder {
@Override
public String decode() {
return "报警数据";
}
}
//驱动电机数据
public class DeviceMotor implements Decoder {
@Override
public String decode() {
return "驱动电机数据";
}
}
//发动机数据
public class Engine implements Decoder {
@Override
public String decode() {
return "发动机数据";
}
}
//车辆位置数据
public class VehiclePosition implements Decoder {
@Override
public String decode() {
return "车辆位置数据";
}
}
メッセージタイプ工場
public class MsgTypeFactory {
/**
* 消息种类的容器
*/
private final static Map<String,Decoder> msgTypeMap = new HashMap<>(4);
static {
msgTypeMap.put(MsgTypeEnum.VEHICLE_POSITION.toString(),new VehiclePosition());
msgTypeMap.put(MsgTypeEnum.ALARM.toString(),new Alarm());
msgTypeMap.put(MsgTypeEnum.DRIVE_MOTOR.toString(),new DeviceMotor());
msgTypeMap.put(MsgTypeEnum.ENGINE.toString(),new Engine());
}
/**
* 获取对应的解码器
* @param msgType 消息类型
* @return 解码器
*/
public static Decoder getDecoder(String msgType){
return msgTypeMap.get(msgType);
}
}
改善列挙型クラスMsgDecoder
public class MsgDecoder {
/**
* 解码消息体
* @param msgTypeEnum 消息类型
* @return 协议具体类型
*/
public String decodeMsg(MsgTypeEnum msgTypeEnum) {
return MsgTypeFactory.getDecoder(msgTypeEnum.toString()).decode();
}
}
工場出荷時のモデルからわかるように、我々は特定のクラスの規定に優れた問題を置くことができ、また、(場合/他)/ケースを切り替える別れる、しかしである口の中、クラスの増加、いくつかの初期化を言及しますデコードされ、マップの内部に格納され、オブジェクトの初期化は、いくつかの比較的小さなオブジェクトであるだけでなく、頻繁に使用する、あらかじめ新しい復号速度が設計パターンの新たな仮復号一時、使用することなく増加させることができ、それは比較的なります他からのより多くのデザインパターンは、それが「スプリット」、別のクラスへの大規模な、重い分割のためのコードが、密接にリンクされています。
実際には、植物は3(シンプル工場、ファクトリメソッド、抽象工場)に分けられ、それらの間の差がクライアントにオブジェクトを作成するために、単純なファクトリクラスに引き渡されている、ファクトリメソッドと抽象工場を達成するために彼らの特定の子に引き渡されましたクラスオブジェクトが作成され、異なる焦点によってファクトリメソッドと抽象工場は、ファクトリメソッド抽象メソッドにフォーカス、抽象工場は、抽象ファクトリ(クラス)に焦点を当てています。属し短い工場で生成に関するデザインパターン、オブジェクトの作成と使用上のデザインパターンに属し、この論文の工場モデルはファクトリクラスの意志を入力した後、通常の簡単なファクトリパターンの簡単な工場アップグレード版ですタイプに応じて、次に対応する新しいオブジェクトを決定するが、この論文では、良好に予め装填され、良好な判断直接頻繁に復号処理の対象の復帰後、より高い効率の向上があります。
策略模式
デコーダクラス公開インターフェース、メッセージの様々なタイプの(説明の便宜のために、それが一緒に表示されている、実際には4つのクラス)コードと同じ植物だけでなく、同じインターフェイスDecodorを達成します
DecodeContext統一クラス
public class DecodeContext {
private Decoder decoder;
public DecodeContext(Decoder decoder) {
this.decoder = decoder;
}
public String decode(){
return decoder.decode();
}
}
クライアントはStrategyTestを使用しています。
public class StrategyTest {
public static void main(String []args){
DecodeContext decodeContext = new DecodeContext(new VehiclePosition());
System.out.println(decodeContext.decode());
}
}
見ることができるポリシーモデルは、各アルゴリズムのパッケージを一連のアルゴリズムを定義し、それらを交換することです。戦略モードでは、アルゴリズムは、独立して、クライアントのそれを使用することができます
总结
読者が見つけて慎重に、実際には、何の削減戦略パターンがあれば、他はありません、クライアントが各ポリシーに入る前に、新しい対応するオブジェクトが必要になります、あなたはまだ場合とそうでない場合、我々は論理的な意思決定を取ることができるかを決定するためのロジックを必要としますそれのクラスへの転送、さらに(植物)を結合の程度を減少させることは、実際にはの真ん中に工場モデルをバリアントん、彼はクラスに転送しますが、直接場合オフセットgetメソッドマップによって判断戦略+結合の工場であり、そして他。