


Contoh analisis corak strategi dan corak keadaan dalam corak reka bentuk java
Senario penggunaan
Mod keadaan: Apabila gelagat objek berubah dengan perubahan keadaan objek, untuk menyahgandingkan berbilang keadaan pertimbangan dan merangkum perubahan tingkah laku , kita boleh menentukan kelas keadaan Abstrak yang menyediakan antara muka tingkah laku objek. Tingkah laku berkaitan keadaan tertentu dilaksanakan oleh subkelasnya.
Mod strategi: Perkataan "strategi" adalah bersamaan dengan algoritma Apabila algoritma perlu ditentukan secara dinamik dalam sistem sebenar dan boleh digantikan antara satu sama lain, antara muka panggilan bagi algoritma boleh disarikan algoritma dilaksanakan oleh peranan strategi khusus Untuk melaksanakan, mengikut prinsip penggantian Liskov, mana-mana tempat di mana kelas induk muncul boleh digantikan dengan subkelasnya, yang memenuhi keperluan perniagaan kita.
Perbandingan
Walaupun kedua-duanya mengabstrakkan antara muka panggilan spesifikasi kelas induk, tingkah laku khusus dilaksanakan oleh subkelas dan objek persekitaran juga mengandungi rujukan kepada kelas induk, tetapi Senario aplikasi kedua-dua mod ini berbeza sama sekali. Contohnya: Jika anda pergi ke ATM untuk mengeluarkan wang, jika akaun anda dibekukan, anda tidak boleh mengeluarkan wang seperti biasa. Di sini, akaun bank anda mempunyai sekurang-kurangnya dua status: beku dan tidak dibekukan. Anda tidak akan terfikir untuk menggunakan corak strategi untuk menyelesaikan penyelesaian perniagaan sedemikian. Satu lagi contoh ialah diskaun pusat membeli-belah Terdapat banyak strategi diskaun untuk produk kanak-kanak, dan produk lama adalah 50% daripada mod negeri negeri dan negeri kanak-kanak!
Analisis kes pengeluaran ATM
Peranan yang direka bentuk: juruwang, akaun, mesin ATM.
Gunakan rajah kes
Demi kesederhanaan, mari analisa kes penggunaan pengeluaran.
Laluan acara asas
(1) Pengeluar memasukkan kad bank dan memasukkan kata laluan;
(2) Memilih pengeluaran operasi dan masukkan jumlah Pengeluaran;
(3) Menunggu wang tunai dikeluarkan.
Dalam kes penggunaan ini, jika akaun pengeluaran telah dibekukan, laluan acara pilihan berlaku dan kes penggunaan pengeluaran ditamatkan.
Keperluan perniagaan utama ialah hakikat bahawa pengguna mengeluarkan wang, jadi pemodelan domain boleh bermula daripada mengenal pasti dua kelas orang pengeluaran dan pengeluaran. Mengambil kira bahawa pengeluaran bukan sahaja mempunyai kes penggunaan pengeluaran wang, kami menyamaratakan pengeluaran itu ke dalam transaksi.
Pemodelan
Realisasi Kes Penggunaan
Penarikan Diri: Realisasi laluan acara asas.
Model domain yang diperhalusi
Di sini objek sempadan ATMSystem diperkenalkan sebagai pengawal yang bertanggungjawab untuk berinteraksi dengan pengguna (antara muka operasi ATM yang berinteraksi dengan pengguna ). Perdagangan ialah kelas yang bertanggungjawab untuk memproses transaksi pengguna.
Pengeluarkan memasukkan kad bank dan memasukkan kata laluan ATMSystem bertanggungjawab untuk menghantar mesej untuk mengesahkan maklumat akaun kepada kelas transaksi Perdagangan mengesahkan sama ada pengguna itu wujud berdasarkan kata laluan akaun yang diluluskan menghantar mesej penyelesaian pemprosesan ke ATMSystem objek Boundary dicerminkan kepada pengguna.
Sesetengah kelas dalam model analisis
Reka bentuk pengeluaran——Mod status aplikasi
Status akaun dibahagikan kepada beku status dan status Pengaktifan. Akaun boleh menjalankan transaksi apabila ia diaktifkan, tetapi tidak boleh membuat sebarang transaksi apabila ia dibekukan. Semasa pengesahan akaun, status akaun semasa harus dikembalikan Jika akaun dibekukan, mesej ralat akan dikembalikan secara langsung apabila operasi pengeluaran dilakukan. Rajah keadaan diwakili seperti berikut:
Rajah struktur mod status permohonan pengeluaran:
Dalam peringkat pengesahan akaun , jika akaun berada dalam Dalam keadaan beku, ia akan terus kembali ke DeadAccount untuk menolak semua transaksi, jika tidak, ia akan kembali ke ActiveAccount untuk memproses transaksi berikutnya.
Kod skematik:
Untuk pelaksanaan mudah, objek sempadan ATMSystem ditinggalkan di sini.
Kelas abstrak maklumat akaun pengguna
/// <summary> /// 用户账号信息 /// </summary> public abstract class Account { /// <summary> /// 账号 /// </summary> private string account; /// <summary> /// 密码 /// </summary> private string pwd; public abstract decimal getBalance(decimal d); }
Bekukan kelas akaun
/// <summary> /// 冻结账户类 /// </summary> public class DeadAccount:Account { public override decimal getBalance(decimal d) { return 0; } }
激活账户类
/// <summary> /// 激活账户类 /// </summary> public class ActiveAccount:Account { public override decimal getBalance(decimal d) { return d; } }
交易类
/// <summary> /// 交易类 负责用户交易处理的类 /// </summary> public class Trade { /// <summary> /// 保存用户账号信息 /// </summary> private Account account; public Account VolidateLogin(Account a) { //query the database to validate the user exists //For Example this.account = new DeadAccount(); return this.account; } /// <summary> /// 商业逻辑 取款 /// </summary> /// <param name="d"></param> /// <returns></returns> public decimal GetBalance(decimal d) { return this.account.getBalance(d); } }
用户类
/// <summary> /// 取款人 /// </summary> public class User { /// <summary> /// 用户账号信息 /// </summary> private Account account; /// <summary> /// 交易处理类 /// </summary> private Trade trade; public User(Account a, Trade t) { this.account = a; tthis.trade = t; } /// <summary> /// 用户登录类 /// </summary> public void Login() { trade.VolidateLogin(account); } /// <summary> /// 取款 /// </summary> /// <param name="d"></param> /// <returns></returns> public decimal GetBalance(decimal d) { return trade.GetBalance(d); } }
客户端代码
class Client { static void Main(string[] args) { //开始用户取款,默认是激活账户 ActiveAccount aa = new ActiveAccount(); Trade t = new Trade(); User u = new User(aa,t); //先登录,后取款 u.Login(); Console.WriteLine(u.GetBalance(100)); Console.ReadLine(); } }
用户必须先登录(插入银行卡,输入密码,点确定),才能选择取款业务(选择取款)。登录之后,返回的账号对象作为trade类成员,当进行取款业务的时候直接引用该账号成员获得取款信息。如果该账号属于冻结账号,则直接返回0。否则返回取款的值。
商品折扣案例
案例描述:某家超市国庆节为了促销,某些类商品打折,比如运动鞋打8折、秋装打9折等,张三去购物为了一双运动鞋、一件秋装、一瓶洗发水。。。,张三买完东西回家,心想今天自己总共“赚”了多少钱?
案例分析:商家对于商品打折可能有很多策略,这里使用策略模式,封装商品打折策略,这样以便以后扩展了打折策略,不用去修改原来的代码,具有很好的灵活性。
模式涉及的角色:
抽象策略角色:通常由一个接口或者抽象实现;
具体策略角色:包装了相关的算法和行为;
环境角色:包含抽象策略角色的引用,最终供用户使用。
商品折扣案例设计图
顾客购物涉及到的角色有:购物车、商品、收银台、抽象策略角色和具体策略角色。
购物车:是摆放商品的容器,提供添加和删除操作;
商品:商品实体,有类型,商品名、价格等属性;
收银台:负责收钱,主要是计算顾客购买所有商品的价格和折扣总额;
抽象策略角色:提供折扣策略接口。
具体策略角色:实现具体折扣算法。
商品折扣示意代码:
/// <summary> /// 具体商品类 /// </summary> public class goods { /// <summary> /// 商品类型 /// </summary> public string Type { set; get; } /// <summary> /// 商品名称 /// </summary> public string Name { get; set; } /// <summary> /// 商品价格 /// </summary> public decimal Price { get; set; } }
抽象策略角色
/// <summary> /// 抽象策略接口 /// </summary> public interface IDiscountStrategy { decimal GetDiscount(goods g); }
具体策略角色
/// <summary> /// 秋装打折策略 /// </summary> public class AutumnDressDiscountStrategy:IDiscountStrategy { #region IDiscountStrategy Members public decimal GetDiscount(goods g) { return (decimal)0.9 * g.Price; } #endregion } /// <summary> /// 运动鞋打折策略 /// </summary> public class SportShoesDiscountStrategy:IDiscountStrategy { #region IDiscountStrategy Members public decimal GetDiscount(goods g) { return g.Price * (decimal)0.8; } #endregion }
购物车
/// <summary> /// 购物车类 负责商品的维护 /// </summary> public class ShoppingCar { private List<goods> goodsList=new List<goods>(); /// <summary> /// 将商品加入到购物车 /// </summary> /// <param name="g"></param> public void AddGoods(goods g) { goodsList.Add(g); } /// <summary> /// 将商品从购物车当中移除 /// </summary> /// <param name="g"></param> public void RemoveGoods(goods g) { goodsList.Remove(g); } public List<goods> GoodsList { get { return goodsList; } } } Salin selepas log masuk |
收银台角色
/// <summary> /// 收银台 /// </summary> public class CashierDesk { /// <summary> /// 购物车 /// </summary> private ShoppingCar shoppingCar; /// <summary> /// 策略字典 /// </summary> private Dictionary<string, IDiscountStrategy> strategies; public CashierDesk(ShoppingCar sc, Dictionary<string, IDiscountStrategy> s) { this.shoppingCar = sc; this.strategies = s; } /// <summary> /// 获得所有商品的价格 /// </summary> /// <returns></returns> public decimal GetTotalPrice() { return shoppingCar.GoodsList.Sum(p => p.Price); } /// <summary> /// 获得所有商品的总的折扣 /// </summary> /// <returns></returns> public decimal GetTotalDiscount() { decimal sum = 0; IDiscountStrategy idiscountStrategy; foreach (goods g in shoppingCar.GoodsList) { idiscountStrategy=strategies.SingleOrDefault(p => p.Key == g.Type).Value; if (idiscountStrategy != null) { sum += idiscountStrategy.GetDiscount(g); } } return sum; } }
客户端代码
class Client { static void Main(string[] args) { ShoppingCar sc = new ShoppingCar(); Dictionary<string, IDiscountStrategy> discountD = new Dictionary<string, IDiscountStrategy>(); //向购物车中加入商品 sc.AddGoods(new goods {Name="NIKE鞋 ",Price=100,Type="运动鞋" }); sc.AddGoods(new goods { Name = "秋装", Price = 200, Type = "秋装" }); sc.AddGoods(new goods { Name = "苹果", Price = 300, Type = "水果" }); //配置折扣策略 discountD.Add("运动鞋", new SportShoesDiscountStrategy()); discountD.Add("秋装", new AutumnDressDiscountStrategy()); CashierDesk cd = new CashierDesk(sc, discountD); //得到所有商品总价 Console.WriteLine(cd.GetTotalPrice()); //得到所有商品折扣价 Console.WriteLine(cd.GetTotalDiscount()); Console.ReadLine(); } }
策略模式优点与缺点:
优点
封装了算法不稳定性,易于以后业务策略的扩展。
缺点
每种策略对应于一个具体策略角色类,会增加系统需要维护的类的数量。
Atas ialah kandungan terperinci Contoh analisis corak strategi dan corak keadaan dalam corak reka bentuk java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4
