Javaデザイナーパターンのビジターパターン①④
現実の生活はあなたの毎日の仕事の世話をすることです。あなたとは何の関係もない愛や見通しを求めないでください。不必要な感情や判断にこだわるな。妄想したり、それに夢中になったりしないでください。自分を傷つけたり、他人に敵対したりしないでください。演じたり、他人の演技を信じたりしないでください。
デザインパターンの学習、近い将来23のデザインパターンについてブログを書きますので、お楽しみに〜
—2021 / 1/17
定義
オブジェクト構造の各要素に作用する操作を表します。これにより、各要素のクラスを変更せずに、これらの要素に作用する新しい操作を定義できます。
アプリケーションシナリオ
最終試験結果が発表されると仮定すると:
成績は次のように分けられます:中国語と数学
学生は次のように分けられます:Xiao Ming、Xiao Hong
従来の方法で科目を追加したり、学生を追加したりする場合は、元のコードを変更する必要があります。これは、オープンとクローズの原則(拡張のためにオープン、変更のためにクローズ)に違反します。これがビジターモードです。
UML类图(1.1)
:
-
赤いボックス:インタビュー対象者(スコア)
-
黄色のボックス:訪問者(学生)
-
ObjectStructureは、成績と学生を集約します。電話をかけると、ObjectStructureを操作できます。
役割分析
-
Achievement():インタビュイーインターフェイス
-
Chinese()/ Mathematics():インタビュイーインターフェースの実装
-
Student():ビジターインターフェース
-
XiaoMing()/ XiaoHong():ビジターインターフェースの実装
-
ObjectStructure():構造オブジェクトの役割。これは、訪問者モデルを使用するために必要な役割です。次の特徴があります。要素を列挙できる、訪問者が要素にアクセスできるようにする高レベルのインターフェイスを提供できる、必要に応じて、複合オブジェクトまたはコレクション(リストや順序付けられていないコレクションなど)として設計できる)。
我理解的ObjectStructure():避免访问者与被访问者直接交互,遵守迪米特原则 (最少知道原则) 迪米特原则定义之一: 一个类对自己依赖的类知道的越少越好,你的东西也别让我知道(不对外泄露信息)
コード
アチーブメントインターフェイス:
public interface Achievement {
//分数
void fraction();
}
中国語のスコア、スコアインターフェイスを実現します。
public class Chinese implements Achievement {
//姓名
private final String name;
//分数
private final double fraction;
//传递姓名和分数
public Chinese(String name ,double fraction) {
this.fraction = fraction;
this.name = name;
}
@Override
public void fraction() {
Log.i("访问者模式",name+" 的语文成绩为 "+fraction+" 分");
}
}
数学の数学のスコア、スコアインターフェイスを実現します。
public class Mathematics implements Achievement {
//姓名
private final String name;
//分数
private final double fraction;
public Mathematics(String name ,double fraction) {
this.fraction = fraction;
this.name = name;
}
@Override
public void fraction() {
Log.i("访问者模式",name+" 的数学成绩为 "+fraction+" 分");
}
}
学生学生インターフェース、スコアインターフェースを集約します。
public interface Student {
//具体学生
void student(Achievement achievement);
}
XiaoMing Xiaoming、学生インターフェースを実装します。
public class XiaoMing implements Student {
@Override
public void student(Achievement achievement) {
//小明成绩
achievement.fraction();
}
}
XiaoHong、学生インターフェースを実現します。
public class XiaoHong implements Student {
@Override
public void student(Achievement achievement) {
achievement.fraction();
}
}
ObjectStructure、構造化オブジェクトの役割(Dimitの原則に準拠):
public class ObjectStructure {
/**
* //输出成绩
* @param student 具体学生
* @param achievement 具体要除数的分数
*/
public void outputAchievement(Student student,Achievement achievement){
student.student(achievement);
}
}
テストコード(クライアント):
//小明
XiaoMing xiaoMing = new XiaoMing();
//小红
XiaoHong xiaoHong = new XiaoHong();
//小明语文成绩
Chinese chinese1 = new Chinese("小明",67);
//小红语文成绩
Chinese chinese2 = new Chinese("小红",100);
//小明数学成绩
Mathematics mathematics = new Mathematics("小明",43);
//结构对象角色
ObjectStructure objectStructure = new ObjectStructure();
xiaoMing.student(chinese1);
objectStructure.outputAchievement(xiaoMing,chinese1);
objectStructure.outputAchievement(xiaoHong,chinese2);
objectStructure.outputAchievement(xiaoMing,mathematics);
Log图(2.1)
:
拡張する方法
たとえば、XiaoZhangという名前のクラスメートである英語を追加する必要があります。
英語英語スコア、スコアインターフェイスを実現します。
public class English implements Achievement{
//姓名
private final String name;
//分数
private final double fraction;
public English(String name ,double fraction) {
this.fraction = fraction;
this.name = name;
}
@Override
public void fraction() {
Log.i("访问者模式",name+" 的英语成绩为 "+fraction+" 分");
}
}
XiaoZhangの学生、学生インターフェースを実装します。
public class XiaoZhang implements Student {
@Override
public void student(Achievement achievement) {
achievement.fraction();
}
}
テストコード(クライアント):
//小张
XiaoZhang xiaoZhang = new XiaoZhang();
//英语成绩
English english = new English("小张", 55);
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.outputAchievement(xiaoZhang,english);
Log图(2.2)
:
まとめ:
- Dimitの原則に従います(直接の友人とのみ通信するほど、クラスが依存するクラスについての知識が少ないほど、情報が漏洩することはありません)これはObjectStructureを指します
- 開閉の原則(拡張のために開く、変更のために閉じる)に準拠する:ここでは、英語とXiao Zhang拡張の追加、優れたスケーラビリティを指します
- 単一責任の原則を遵守する:(1つのクラスが1つの責任を負うのではなく、1つのクラスが1つの責任を負う)、ここでは、学年/学生に対応する実装クラスを指します。
オリジナリティは簡単ではありません、あなたの好きなものは私にとってあなたの最大のサポートです〜