日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

设计模式NO.2

發(fā)布時(shí)間:2025/3/21 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式NO.2 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

設(shè)計(jì)模式NO.2

本次博客內(nèi)容為第二次設(shè)計(jì)模式的練習(xí)。根據(jù)老師的要求完成下列題目:

題目1

如果需要開(kāi)發(fā)一個(gè)跨平臺(tái)視頻播放器,可以在不同操作系統(tǒng)平臺(tái)(如Windows、Linux、UNIX等)上播放多種格式的視頻文件,常見(jiàn)的視頻格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式來(lái)設(shè)計(jì)。
類(lèi)圖設(shè)計(jì)如下:

代碼實(shí)現(xiàn)如下:
a.視頻格式抽象類(lèi)

public abstract class Form {public abstract void playForm(String os);}

b.AVI視頻格式類(lèi)

public class AVI extends Form{@Overridepublic void playForm(String os) {System.out.println("the form of video is AVI. OS version is "+os);}}

c.MPEG視頻格式類(lèi)

public class MPEG extends Form{@Overridepublic void playForm(String os) {System.out.println("the form of video is MPEG. OS version is "+os);}}

d.RMVB視頻格式類(lèi)

public class RMVB extends Form{@Overridepublic void playForm(String os) {System.out.println("the form of video is RMVB. OS version is "+os);}}

e.WAV視頻格式類(lèi)

public class WAV extends Form{@Overridepublic void playForm(String os) {System.out.println("the form of video is WAV. OS version is "+os);} }

f.操作系統(tǒng)抽象類(lèi)

public abstract class OS {protected Form m_form;public void setForm(Form form){m_form=form;}public abstract void play();}

g.Windows系統(tǒng)類(lèi)

public class Windows extends OS{@Overridepublic void play() {m_form.playForm("Windows");}}

h.Linux系統(tǒng)類(lèi)

public class Linux extends OS{@Overridepublic void play() {m_form.playForm("Linux");} }

i.UNIX系統(tǒng)類(lèi)

public class UNIX extends OS{@Overridepublic void play() {m_form.playForm("UNIX");} }

j.測(cè)試代碼

public static void main(String[] args) {Form form = new RMVB();OS os = new Windows();os.setForm(form);os.play();//the form of video is RMVB. OS version is Windowsform = new AVI();os = new Linux();os.setForm(form);os.play();//the form of video is AVI. OS version is Linux}

Bridge模式小結(jié)

a.優(yōu)點(diǎn)
橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離開(kāi)來(lái),使他們都可以獨(dú)立變化。 橋接模式將繼承關(guān)系轉(zhuǎn)化成關(guān)聯(lián)關(guān)系,它降低了類(lèi)與類(lèi)之間的耦合度,減少了系統(tǒng)中類(lèi)的數(shù)量,也減少了代碼量。
b.適用場(chǎng)景

  • 如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過(guò)橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。
  • 對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類(lèi)的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
  • 一個(gè)類(lèi)存在兩個(gè)獨(dú)立變化的維度,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展。

題目2

殺毒軟件(AntiVirus)既能對(duì)系統(tǒng)中不同類(lèi)型的文件 TextFile、ImageFile、VideoFile殺毒,也能對(duì)文件夾的殺毒,對(duì)文件夾殺毒就是對(duì)其中所包含文件的殺毒。使用Composite模式來(lái)設(shè)計(jì)。
類(lèi)圖設(shè)計(jì)如下:

代碼實(shí)現(xiàn)如下:
a.抽象文件類(lèi)

public abstract class Files {public abstract void antiVirus(); }

b.TextFile類(lèi)

public class TextFile extends Files {@Overridepublic void antiVirus() {System.out.println("TextFile is antivirusing!");}}

c.ImageFile類(lèi)

public class ImageFile extends Files{@Overridepublic void antiVirus() {System.out.println("ImageFile is antivirusing!");}}

d.VideoFile類(lèi)

public class VideoFile extends Files{@Overridepublic void antiVirus() {System.out.println("VideoFile is antivirusing");}}

e.FolderFile類(lèi)

import java.util.ArrayList;public class FloderFile extends Files{private ArrayList<Files> m_files=new ArrayList<Files>();@Overridepublic void antiVirus() {System.out.println("folder is antivirusing!");for(Files file:m_files){file.antiVirus();}}public void addFile(Files file){m_files.add(file);}public void deleteFile(Files file){m_files.remove(file);}}

f.AntiVirus類(lèi)(測(cè)試類(lèi))

public class AntiVirus {public static void main(String[] args) {Files file = new VideoFile();file.antiVirus();//VideoFile is antivirusingFiles file2 = new TextFile();file2.antiVirus();//TextFile is antivirusing!FloderFile files = new FloderFile();files.addFile(file);files.addFile(file2);files.antiVirus();//folder is antivirusing!//VideoFile is antivirusing//TextFile is antivirusing!}}

Composite模式小結(jié)

Composite模式有兩種形態(tài):透明形態(tài)和安全形態(tài)。本文是使用安全形態(tài)實(shí)現(xiàn)的。
a.優(yōu)點(diǎn)
Composite模式 定義了包含基本對(duì)象和組合對(duì)象的類(lèi)層次結(jié)構(gòu),這不僅可以簡(jiǎn)化客戶(hù)代碼,而且使得更容易增加新類(lèi)型的組件、設(shè)計(jì)變得更加一般化。
b.適用場(chǎng)景

  • 將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示 “部分-整體” 的層次結(jié)構(gòu)。
  • 使得用戶(hù)對(duì)于單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

題目3

某系統(tǒng)提供一個(gè)數(shù)據(jù)加密功能,可以對(duì)字符串進(jìn)行加密。最簡(jiǎn)單的加密算法通過(guò)對(duì)字母進(jìn)行移位來(lái)實(shí)現(xiàn),同時(shí)還提供稍復(fù)雜的逆向輸出加密,還提供更為高級(jí)的求模加密。用戶(hù)首先使用最簡(jiǎn)單的加密算法對(duì)字符串進(jìn)行加密,如果覺(jué)得還不夠可以對(duì)加密后的結(jié)果使用其他的加密算法進(jìn)行二次加密,當(dāng)然也可以進(jìn)行第三次加密。使用Decrator模式來(lái)設(shè)計(jì)。
類(lèi)圖設(shè)計(jì)如下:

代碼實(shí)現(xiàn)如下:
a.抽象加密接口

public interface Encryption {public void encrypt(); }

b.字母移位加密類(lèi)

public class ShiftEncryption implements Encryption{@Overridepublic void encrypt() {System.out.println("ShiftEncryption");} }

c.逆向輸出加密類(lèi)

public class ConverseEncryption extends Decrator{public ConverseEncryption(Encryption enc) {super(enc);}public void encrypt() {m_way.encrypt();System.out.println("ConverseEncryption");} }

d.求模加密類(lèi)

public class ModEncryption extends Decrator{public ModEncryption(Encryption enc) {super(enc);}public void encrypt() {m_way.encrypt();System.out.println("ModEncryption");}}

e. Decrator類(lèi)

public class Decrator implements Encryption{protected Encryption m_way;public Decrator(Encryption enc) {m_way=enc;}@Overridepublic void encrypt() {m_way.encrypt();}}

f.測(cè)試類(lèi)

public class test {public static void main(String[] args) {Encryption enc = new ShiftEncryption();enc = new ModEncryption(enc);enc = new ConverseEncryption(enc);enc = new ModEncryption(enc);enc.encrypt();//ShiftEncryption//ModEncryption//ConverseEncryption//ModEncryption}}

Decrator模式小結(jié)

Decrator模式有透明和半透明兩種形態(tài)。透明形態(tài)是指:裝飾者不改變接口類(lèi)型。半透明形態(tài)是指:裝飾者改變接口類(lèi)型,增加新的方法。
本文使用的是透明形態(tài)的Decrator模式。
a.優(yōu)點(diǎn)
裝飾模式可以在不改變接口的前提下動(dòng)態(tài)地增強(qiáng)所考慮的類(lèi)的性能。通過(guò)使用不同的具體裝飾類(lèi)以及這些裝飾類(lèi)的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合。
b.適用場(chǎng)景

  • 需要?jiǎng)討B(tài)的給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)地撤銷(xiāo)。
  • 需要增加一些基本功能的排列組合而產(chǎn)生的非常大量的功能。

題目4

某系統(tǒng)需要提供一個(gè)文件加密模塊,加密流程包括:讀源文件、加密、保存加密文件。讀取文件和保存文件使用流來(lái)實(shí)現(xiàn),三個(gè)業(yè)務(wù)相對(duì)獨(dú)立,封裝在不同的類(lèi)中;現(xiàn)在需要提供一個(gè)統(tǒng)一的加密外觀(guān)類(lèi),用戶(hù)可以直接使用該加密外觀(guān)類(lèi)完成文件的讀取、加密和保存三個(gè)操作。使用Facade模式來(lái)設(shè)計(jì)。
類(lèi)圖設(shè)計(jì)如下:

代碼實(shí)現(xiàn)如下:
a.抽象Facade接口

public interface Facade {public void Encrypt(); }

b.文件加密裝飾者FacadeEncryptor

public class FacadeEncryptor implements Facade{private Reader m_read;private Saver m_saver;private Encryptor m_encryptor;public FacadeEncryptor() {m_read = new Reader();m_saver = new Saver();m_encryptor = new Encryptor();}@Overridepublic void Encrypt() {m_read.FileReade();m_encryptor.FileEncrypt();m_saver.FileSave();}}

c.讀取文件類(lèi)

public class Reader {public void FileReade(){System.out.println("File is reading!");} }

d.加密文件類(lèi)

public class Encryptor {public void FileEncrypt(){System.out.println("File is encrypting!");}}

e.保存文件類(lèi)

public class Saver {public void FileSave(){System.out.println("File is saving!");}}

f.測(cè)試類(lèi)

public class Client {public static void main(String[] args) {Facade fac = new FacadeEncryptor();fac.Encrypt();//File is reading!//File is encrypting!//File is saving!}}

Facade模式小結(jié)

a.優(yōu)點(diǎn)

  • 對(duì)客戶(hù)屏蔽子系統(tǒng)組件,減少了客戶(hù)處理的對(duì)象數(shù)目并使得子系統(tǒng)使用起來(lái)更加容易。
  • 實(shí)現(xiàn)了子系統(tǒng)與客戶(hù)之間的松耦合關(guān)系。
  • 只是提供了一個(gè)訪(fǎng)問(wèn)子系統(tǒng)的統(tǒng)一入口,并不影響用戶(hù)直接使用子系統(tǒng)類(lèi)

b.適用場(chǎng)景

  • 需要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。
  • 客戶(hù)程序與抽象類(lèi)的實(shí)現(xiàn)部分之間存在著很大的依賴(lài)性。
  • 需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí)。

題目5

某論壇已注冊(cè)用戶(hù)和游客的權(quán)限不同,已注冊(cè)用戶(hù)擁有發(fā)帖、修改自己的注冊(cè)信息等功能;游客只能看別人的帖子,沒(méi)有其他權(quán)限。使用Proxy模式來(lái)設(shè)計(jì)。
類(lèi)圖設(shè)計(jì)如下:

代碼實(shí)現(xiàn)如下:
a.抽象用戶(hù)類(lèi)

public abstract class User {public abstract void view();public abstract void post();public abstract void modify(); }

b.注冊(cè)用戶(hù)類(lèi)

public class realUser extends User{@Overridepublic void view() {System.out.println("please view nicely!");}@Overridepublic void post() {System.out.println("please post nicely!");}@Overridepublic void modify() {System.out.println("please modify rightly!");}}

c.游客類(lèi)

public class visitor extends User{private User user;public visitor(User user){this.user=user;}@Overridepublic void view() {user.view();}@Overridepublic void post() {System.out.println("please login!");}@Overridepublic void modify() {System.out.println("please login!");}}

d.測(cè)試類(lèi)

public class Client {public static void main(String[] args) {User u1 = new realUser();u1.view();//please view nicely!u1.post();//please post nicely!u1.modify();//please modify rightly!u1 = new visitor(u1);u1.view();//please view nicely!u1.post();//please login!u1.modify();//please login!} }

Proxy模式小結(jié)

a.優(yōu)點(diǎn)

  • 代理對(duì)象可以在客戶(hù)端和目標(biāo)對(duì)象之間起到中介的作用,這樣起到了中介的作用和保護(hù)了目標(biāo)對(duì)象的作用。
  • 真實(shí)的角色就是實(shí)現(xiàn)實(shí)際的業(yè)務(wù)邏輯,不用關(guān)心其他非本職責(zé)的事務(wù),通過(guò)后期的代理完成一件完成事務(wù),附帶的結(jié)果就是編程簡(jiǎn)潔清晰。

b.適用場(chǎng)景

  • 需要為一個(gè)對(duì)象在不同的地址空間提供局部代表的時(shí)候,可以使用遠(yuǎn)程代理。
  • 需要控制對(duì)原始對(duì)象的訪(fǎng)問(wèn)的時(shí)候,可以使用保護(hù)代理。
  • 需要在訪(fǎng)問(wèn)對(duì)象執(zhí)行一些附加操作的時(shí)候,可以使用智能指引代理。
    需要為一個(gè)對(duì)象在不同的地址空間提供局部代表的時(shí)候,可以使用遠(yuǎn)程代理。

轉(zhuǎn)載于:https://www.cnblogs.com/willingtosmile/p/7814762.html

總結(jié)

以上是生活随笔為你收集整理的设计模式NO.2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。