デザインパターン
使用するシーン
ソフトウェアアーキテクチャとプログラミング
目的
1.コードの再利用性を
向上させる2.コードの可読性を向上させる
3.コードの信頼性を確保する
設計原理と特性
1.拡張性
2.柔軟性
3.コンポーネントベースのプラガビリティ(プラガビリティ)
ガイドライン
- 単一責任の原則:Javaクラスのストレージ関数は、異なる属性の関数を実現できません。食べることと眠ることは2つのことであり、オブジェクトは別々に作成する必要があります。
class HandleUser{
// 增删改查 操作用户 登录注册功能
public User getUser(){};
public void updateUser(int id){};
public void saveUser(int id){};
public void removeUser(int id){};
// 用户玩游戏
public void userPlayGame();
}
/**
*
* 这两个功能是不是不应该杂糅在一起,所以需要创建两个Java类,来存放不同功能
*
*/
class UserHandleDao{
// 增删改查 操作用户 登录注册功能
public User getUser(){};
public void updateUser(int id){};
public void saveUser(int id){};
public void removeUser(int id){};
}
class UserBusinessDao{
// 用户玩游戏
public void userPlayGame(){};
}
- 開閉の原則:ソフトウェアは外部拡張に対してオープンであり、外部変更はクローズされており、食べるときに選択する必要があり、選択肢があり、需要があり、好みの必要性があります。トマトを食べるのが好きなら、まだ食べていない世界の食べ物を味わう必要があります食べ物は当然、おいしいかどうかを判断するための実験が必要ですが、どんなにおいしい食べ物でも、元のお気に入りには影響しません食べ物。これは同じ理由です。
class UserBusinessImpl{
@注入
private ConncetMouxinUtil;
// 普通用户玩游戏 国王游戏
public void ordinaryUserPlayGame(){};
// VIP用户玩游戏
public void VipUserPlayGame(){};
}
/**
*
* 用户玩本公司的游戏,以及登录注册游戏账号,但是呢大家都是有身份的人,怎么会没有某信账号
* 什么?没有某信注册账号,对不起我不玩辣鸡游戏
* 这时我们需要外接接口,挽救玩家
*
*/
class ConncetMouxinUtil{
// 软件的扩展,但是也拒绝其某信修改或者获取软件数据
public void connectMouxin(){};
}
- リヒター置換原則:同じ属性と機能を持つことは親クラスに要約され、子クラスは親クラスの属性と機能を継承します。たとえば、母と娘、父と息子、4人家族、娘と息子父と息子のお母さんの優れた遺伝子を受け継いで、生まれた瞬間から、あなたの体の見た目はすべてあなたの両親によって提供されます。あなたはまた、あなたの両親と同じ寿命、思考、意識、そして知恵を持っており、すべてあなたの両親から受け継がれています。もちろん、人間にはさまざまな属性があるため、一般化することはできません。親クラスでは、あなたの性格や将来の発展などがあります。
class TravelerKong{
// 技能:裂空之剑
public void skillLiekongZhijian(String AKey){
System.out.println("造成9999伤害!");
}
}
class TravelerYing{
// 技能:异邦铁风
public void skillYibangTiefeng(String BKey){
System.out.println("造成100000伤害!");
}
}
/**
*
* 你看空和荧的技能参数一样,功能也一样,只是输出不一样
* 可要是每个人物都写这样无数的技能,维护和板砖都是极不友好
* 平A你都要给写一个对象吗
*
*/
class TravelerTian{
// 技能:万物归一
public void skillWanwuGuiyi(String AKey,String hurt){
System.out.println(hurt);
}
}
class TravelerKong extends TravelerTian{
@Override
public void skillWanwuGuiyi(String AKey,String hurt){
// 非空判断省略了
if( AKey == KEY_FLG )
System.out.println(hurt);
}
}
class TravelerYing extends TravelerTian{
private static final String KEY_FLG = "1";
@Override
public void skillWanwuGuiyi(String AKey,String hurt){
if( AKey == KEY_FLG )
System.out.println(hurt);
}
}
class PersonageTest{
private static final String KONG_HURT = "造成9999伤害!";
private static final String YING_HURT = "造成100000伤害!";
private static final String KEY_FLG = "1";
@Test
public void GameTest(){
TravelerTian tk = new TravelerKong();
// 某某调用了这个方法 判断省略了
tk.skillWanwuGuiyi(parma , KONG_HURT);
TravelerTian ty = new TravelerYing();
// 某某调用了这个方法 判断省略了
ty.skillWanwuGuiyi(parma , YING_HURT );
}
}
- 逆転の原則に依存する:インターフェース指向プログラミング、インターフェースは特定のアクションを確認するための単なる別名であり、それがどのようなアクションであるかを説明するため、特定のアクションのプロセスは発生せず、プロセスを本当に描写したい場合アクションの場合、この時点でJavaクラスが必要です。特定のアクションエイリアスのインターフェイスを実装します。たとえば、寝る、座って寝る、座って寝るというのは単なる用語です。注意深く観察する必要がある後、Ge Youは、ベンチ、少し開いた口がゴロゴロと音を立て、ハラジは納得のいくように小さな川に流れ込みました。これは、座っているときと寝ているときの動作の具体的な説明であり、寝ているときの動き全体と、横になっているときの同じ状況を完全に視覚化しています。
class interface MyGame {
void LOL();
void YuanShen();
void CF();
void WangZheRongYang();
.......
}
/**
*
* 接口只是一个万物的名字代称,不具备业务实现
* 而我们将这类相同属性的事务,归纳到一个接口中,这就是我所理解的面向接口编程
*
*/
class UserGame implements MyGame {
// 接口需要全部实现方法
public void LOL(){};
public void YuanShen(){};
public void CF(){};
public void WangZheRongYang(){};
}
- インターフェース分離の原則:同様のアクション、データ処理動作、別々に保存するための異なるインターフェイスの統一された使用、座っていると寝ている、横になっていると寝ているという2つの動作と同様に、1つのアクションであり、1つのインターフェイスが保存されます;空腹で食事をしながらゆっくり噛む食べ物を味わうことは別の行動であり、保管のために別のインターフェースが必要です。
class interface MyGame {
void LOL();
void YuanShen();
void CF();
void WangZheRongYang();
void aOiSoLa();
}
/**
*
* aOiSoLa()这是什么鬼?你们细细品会,这两个东西当然不能放在一起,会出大事的!
*
*/
- 合成再利用の原則:システムで組み合わせと集約の関連付けを使用し、継承関係を少なくして、コードの結合を引き起こします。簡単に言えば、あなたとあなたの仲間は、父親を認めるという事実を達成しますか?現時点では、息子の呼びかけの事実、口と一口を言葉で表現する必要がありますが、息子はあなたを父親として実際に認識せず、あなたを父親と見なします。そうすれば、息子が増えるだけでなく、息子に利益をもたらすことは絶対に不可能です。息子は息子です。父親の利益を望まないでください。息子を呼ぶときは、いつものように用事をカフェテリアに走らせて食べ物を持ってきます。これが理由です。息子がすべきです。sonは、sonオブジェクトを直接宣言し、後続のメソッドで呼び出すJavaクラスと同等です。
class TravelerTian{
// 技能:万物归一
public void skillWanwuGuiyi(String AKey,String hurt){
System.out.println(hurt);
};
}
class TravelerKong extends TravelerTian{
public void doRequest(){
super.skillWanwuGuiyi("1","123");
}
}
/**
*
* 某天你收到用户差评,要求你把钟离伤害拉高,糟糕的是,你写了继承关系
* 该死,你必须要在父类中添加方法,可是一旦添加方法
* 子类必须继承一个没有任何用处的方法,造成代码的耦合性
* 为此,你必须将继承关系改写为组合关系
* 正因为父类是抽象类
*
*/
class TravelerKong {
@注入
private TravelerTian travelerTian;
public void doRequest(){
travelerTian.skillWanwuGuiyi("1","123");
}
}
- ディミットのルール:1つのクラスは他のタイプのビジネスを減らし、3番目のタイプはこのタイプのビジネスと呼ぶために導入されます。人の日課がプログラムされている場合、食事、睡眠、仕事、勉強、娯楽、これらは毎日起こりますが、少し異なります。1つのJavaクラスに毎日要約することはできません。無数のJavaクラスがあります。その後、食事と睡眠を別々のJavaクラスに入れる必要があります。完全に独立したイベント、食事は食事、睡眠は睡眠、あなたこの2つを混同することはできないので、当然2つのオブジェクトになります。その日のことを要約する必要がある場合、メインクラスはこのオブジェクトを呼び出して、睡眠姿勢と食事のオブジェクトのプロパティを再定義します。
class MyWordGame { // 现实 虚拟 大脑 // 游戏要远离现实世界 public void fleeReality(){} // 游戏要进入虚拟世界 public void entrySuppositional(){} // 大脑要分辨现实和虚拟 public void brainDiscriminateRAE(){} } /** * * 仔细想想,这三个的关系,一定大脑在前,现实在后,虚拟在末尾 * 三者不能同时进行,必定有多层处理,需要重新将包结构建立 * 以前都是在同一个包内 * */ com.hikktn.reality com.hikktn.suppositional com.hikktn.brain 继续进行业务细化 com.hikktn.reality.service com.hikktn.reality.dao com.hikktn.reality.controller 与此类推 ……