一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java經(jīng)典設(shè)計模式之策略模式原理與用法詳解

Java經(jīng)典設(shè)計模式之策略模式原理與用法詳解

2020-12-11 15:15遲做總比不做強 Java教程

這篇文章主要介紹了Java經(jīng)典設(shè)計模式之策略模式,簡單說明了策略模式的概念、原理并結(jié)合實例形式分析了java策略模式的具有用法與相關(guān)注意事項,需要的朋友可以參考下

本文實例講述了Java經(jīng)典設(shè)計模式策略模式。分享給大家供大家參考,具體如下:

策略模式指:策略模式指將程序中可變部分抽象分離成一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。

策略模式一般由下面三部分組成:

1. 抽象策略角色: 策略類,通常由一個接口或者抽象類實現(xiàn)。
2. 具體策略角色:包裝了相關(guān)的算法和行為。
3. 環(huán)境角色:持有某一個策略類的引用,客戶端調(diào)用。

策略模式設(shè)計原則:

1. 把程序中需要變化的部分抽離出來,獨立于不變的部分
2. 面向接口編程,而不是面向?qū)崿F(xiàn)編程,多作組合 ,少用繼承。(組合 :在類中增加一個私有域,引用另外一個已經(jīng)有的類的實例,通過調(diào)用實例的方法從而獲得新的功能)

應(yīng)用舉例,以銀行為例,可能有點不恰當(dāng)

比如我們應(yīng)用要接入銀行支付功能。我們都知道,銀行都有支付功能,隨著技術(shù)的發(fā)展,銀行具有了開通網(wǎng)絡(luò)支付的功能。現(xiàn)在我們遇到的問題是,我們要增加支付的銀行,但是有的銀行還沒有開通網(wǎng)絡(luò)銀行,有的已經(jīng)開通了,而且也要把原有接入 的銀行添加上網(wǎng)絡(luò)銀行功能(如果已經(jīng)開通的話)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//銀行基類,為了適應(yīng)變化,增加了網(wǎng)絡(luò)支付處理的策略處理接口BankStrategy
public abstract class Bank {
private BankStrategy mBankStrategy;
public void setmStrategy(BankStrategy mStrategy) {
this.mBankStrategy = mStrategy;
}
public void payMoney() {
System.out.println("我具有支付功能");// 所有銀行共同的特征
}
public abstract void serviceStyle();// 但每個銀行有不同的服務(wù)方法(比的就是服務(wù)),具體的子類實現(xiàn)
public void netBank(){//開通網(wǎng)上銀行
mBankStrategy.netPay();
}
}
//———-銀行策略接口———————————
public interface BankStrategy {
void netPay();// 添加網(wǎng)絡(luò)支付功能
}
//————–增加開通網(wǎng)絡(luò)支付的策略實現(xiàn)類————
public class CanNetBank implements BankStrategy {
@Override
public void netPay() {
System.out.println("我已經(jīng)開通網(wǎng)絡(luò)支付功能");
}
}
//————–也有不開通網(wǎng)絡(luò)支付的銀行—————
public class NoNetBank implements BankStrategy {
@Override
public void netPay() {
System.out.println("我不開通網(wǎng)絡(luò)銀行,咋的!");
}
}
//——-地球銀行:現(xiàn)在開通網(wǎng)絡(luò)支付——————
public class EarthBank extends Bank {
public EarthBank(){
super();
super.setmStrategy(new CanNetBank());//這里就實現(xiàn)了網(wǎng)絡(luò)支付
}
@Override
public void serviceStyle() {
System.out.println("我的服務(wù)在事個地球上是最好的!");
}
}
//——–太陽銀行,說離我們太遠了,不開通網(wǎng)絡(luò)銀行——————-
public class SunBank extends Bank {
public SunBank(){
super();
super.setmStrategy(new NoNetBank());//這里就不開通了(當(dāng)然可不調(diào)用 ,只是告訴下實現(xiàn)方法)
}
@Override
public void serviceStyle() {
System.out.println("我的服務(wù)像金子一樣發(fā)光!");
}
}
//———測試類———————————–
public class Test {
public static void main(String[] args) {
System.out.println("———測試———–");
Bank duck=null;
duck=new EarthBank();
duck.serviceStyle();
duck.payMoney();
duck.netBank();
System.out.println("———測試———–");
duck=new SunBank();
duck.serviceStyle();
duck.payMoney();
duck.netBank();
}
}

結(jié)果打印

Java經(jīng)典設(shè)計模式之策略模式原理與用法詳解

策略模式的優(yōu)點:

1、 提供了管理相關(guān)的算法策略類,恰當(dāng)使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面,避免重復(fù)的代碼,使得架構(gòu)也更加靈活。
2、 提供了可以替換繼承關(guān)系的辦法(組合)。繼承也可以處理多種算法或行為,但算法或行為的環(huán)境類就可能會有一些子類,每一個子類提供一個不同的算法或行為。這樣一來算法或行為的使用者就和算法或行為本身混在一起。使得動態(tài)改變算法變得復(fù)雜甚至不可行,也不符合開閉原則。
3、 相對于繼承代碼更好地得到復(fù)用,同時可以避免使用多重條件轉(zhuǎn)移語句。

策略模式的缺點:

1、客戶代碼需要了解個策略實現(xiàn)的細節(jié),只適用于客戶端知道所有的算法或行為的情況。
2、 策略模式造成很多的策略類,每個具體策略類都會產(chǎn)生一個新類,增加了對象的數(shù)目。

希望本文所述對大家java程序設(shè)計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女同志 videos | 美女福利视频午夜在线 | 美女扒下内裤让男人桶的图片 | 美女女女女女女bbbbbb毛片 | 午夜福利体验免费体验区 | jux539原千岁在线播放 | 国产精品成人免费福利 | 高跟丝袜麻麻求我调教 | a级免费观看 | 我的妹妹最近有点怪免费播放 | 高清黄色直接看 | 成 人 免费 小说在线观看 | 好大夫在线个人空间 | caoporn草棚在线视频 | 九九免费高清在线观看视频 | 夫妻性生活免费在线观看 | 四虎成人免费观看在线网址 | 涩涩屋在线播放 | 四虎国产精品免费入口 | h版在线观看| 精品国产成人高清在线 | 9191久久 | 猫扑俩性| 欧美成人中文字幕 | 日本三级欧美三级人妇英文 | 四虎影视在线观看永久地址 | 国内自拍成人网在线视频 | 国产成人成人一区二区 | 桃色导航| 日本大片网 | 纲手被鸣人插 | 非洲黑人bbwbbwbbw | 午夜免费体验30分 | 亚洲精品国产自在现线最新 | 火影小南被爆羞羞网站进入 | 色哟约| a毛片免费观看完整 | aaa大片| 久久久久999 | 亚洲AV无码国产精品午夜久久 | 欧美vpswindowssex 欧美va在线高清 |