设计模式NO.2
设计模式NO.2
本次博客内容为第二次设计模式的练习。根据老师的要求完成下列题目:
题目1
如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、UNIX等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式来设计。
类图设计如下:
代码实现如下:
a.视频格式抽象类
public abstract class Form {
public abstract void playForm(String os);
}
b.AVI视频格式类
public class AVI extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is AVI. OS version is "+os);
}
}
c.MPEG视频格式类
public class MPEG extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is MPEG. OS version is "+os);
}
}
d.RMVB视频格式类
public class RMVB extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is RMVB. OS version is "+os);
}
}
e.WAV视频格式类
public class WAV extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is WAV. OS version is "+os);
}
}
f.操作系统抽象类
public abstract class OS {
protected Form m_form;
public void setForm(Form form)
{
m_form=form;
}
public abstract void play();
}
g.Windows系统类
public class Windows extends OS{
@Override
public void play() {
m_form.playForm("Windows");
}
}
h.Linux系统类
public class Linux extends OS{
@Override
public void play() {
m_form.playForm("Linux");
}
}
i.UNIX系统类
public class UNIX extends OS{
@Override
public void play() {
m_form.playForm("UNIX");
}
}
j.测试代码
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 Windows
form = new AVI();
os = new Linux();
os.setForm(form);
os.play();//the form of video is AVI. OS version is Linux
}
Bridge模式小结
a.优点
桥接模式将抽象部分与它的实现部分分离开来,使他们都可以独立变化。 桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
b.适用场景
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
题目2
杀毒软件(AntiVirus)既能对系统中不同类型的文件 TextFile、ImageFile、VideoFile杀毒,也能对文件夹的杀毒,对文件夹杀毒就是对其中所包含文件的杀毒。使用Composite模式来设计。
类图设计如下:
代码实现如下:
a.抽象文件类
public abstract class Files {
public abstract void antiVirus();
}
b.TextFile类
public class TextFile extends Files
{
@Override
public void antiVirus() {
System.out.println("TextFile is antivirusing!");
}
}
c.ImageFile类
public class ImageFile extends Files{
@Override
public void antiVirus() {
System.out.println("ImageFile is antivirusing!");
}
}
d.VideoFile类
public class VideoFile extends Files{
@Override
public void antiVirus() {
System.out.println("VideoFile is antivirusing");
}
}
e.FolderFile类
import java.util.ArrayList;
public class FloderFile extends Files{
private ArrayList<Files> m_files=new ArrayList<Files>();
@Override
public 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类(测试类)
public class AntiVirus {
public static void main(String[] args) {
Files file = new VideoFile();
file.antiVirus();//VideoFile is antivirusing
Files 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模式小结
Composite模式有两种形态:透明形态和安全形态。本文是使用安全形态实现的。
a.优点
Composite模式 定义了包含基本对象和组合对象的类层次结构,这不仅可以简化客户代码,而且使得更容易增加新类型的组件、设计变得更加一般化。
b.适用场景
- 将对象组合成树形结构以表示 “部分-整体” 的层次结构。
- 使得用户对于单个对象和组合对象的使用具有一致性。
题目3
某系统提供一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供稍复杂的逆向输出加密,还提供更为高级的求模加密。用户首先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密后的结果使用其他的加密算法进行二次加密,当然也可以进行第三次加密。使用Decrator模式来设计。
类图设计如下:
代码实现如下:
a.抽象加密接口
public interface Encryption {
public void encrypt();
}
b.字母移位加密类
public class ShiftEncryption implements Encryption{
@Override
public void encrypt() {
System.out.println("ShiftEncryption");
}
}
c.逆向输出加密类
public class ConverseEncryption extends Decrator{
public ConverseEncryption(Encryption enc) {
super(enc);
}
public void encrypt() {
m_way.encrypt();
System.out.println("ConverseEncryption");
}
}
d.求模加密类
public class ModEncryption extends Decrator{
public ModEncryption(Encryption enc) {
super(enc);
}
public void encrypt() {
m_way.encrypt();
System.out.println("ModEncryption");
}
}
e. Decrator类
public class Decrator implements Encryption{
protected Encryption m_way;
public Decrator(Encryption enc) {
m_way=enc;
}
@Override
public void encrypt() {
m_way.encrypt();
}
}
f.测试类
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模式小结
Decrator模式有透明和半透明两种形态。透明形态是指:装饰者不改变接口类型。半透明形态是指:装饰者改变接口类型,增加新的方法。
本文使用的是透明形态的Decrator模式。
a.优点
装饰模式可以在不改变接口的前提下动态地增强所考虑的类的性能。通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
b.适用场景
- 需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
- 需要增加一些基本功能的排列组合而产生的非常大量的功能。
题目4
某系统需要提供一个文件加密模块,加密流程包括:读源文件、加密、保存加密文件。读取文件和保存文件使用流来实现,三个业务相对独立,封装在不同的类中;现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作。使用Facade模式来设计。
类图设计如下:
代码实现如下:
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();
}
@Override
public void Encrypt() {
m_read.FileReade();
m_encryptor.FileEncrypt();
m_saver.FileSave();
}
}
c.读取文件类
public class Reader {
public void FileReade()
{
System.out.println("File is reading!");
}
}
d.加密文件类
public class Encryptor {
public void FileEncrypt()
{
System.out.println("File is encrypting!");
}
}
e.保存文件类
public class Saver {
public void FileSave()
{
System.out.println("File is saving!");
}
}
f.测试类
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模式小结
a.优点
- 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。
- 实现了子系统与客户之间的松耦合关系。
- 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
b.适用场景
- 需要为一个复杂子系统提供一个简单接口时。
- 客户程序与抽象类的实现部分之间存在着很大的依赖性。
- 需要构建一个层次结构的子系统时。
题目5
某论坛已注册用户和游客的权限不同,已注册用户拥有发帖、修改自己的注册信息等功能;游客只能看别人的帖子,没有其他权限。使用Proxy模式来设计。
类图设计如下:
代码实现如下:
a.抽象用户类
public abstract class User {
public abstract void view();
public abstract void post();
public abstract void modify();
}
b.注册用户类
public class realUser extends User{
@Override
public void view() {
System.out.println("please view nicely!");
}
@Override
public void post() {
System.out.println("please post nicely!");
}
@Override
public void modify() {
System.out.println("please modify rightly!");
}
}
c.游客类
public class visitor extends User{
private User user;
public visitor(User user)
{
this.user=user;
}
@Override
public void view() {
user.view();
}
@Override
public void post() {
System.out.println("please login!");
}
@Override
public void modify() {
System.out.println("please login!");
}
}
d.测试类
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模式小结
a.优点
- 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
- 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
b.适用场景
- 需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理。
- 需要控制对原始对象的访问的时候,可以使用保护代理。
- 需要在访问对象执行一些附加操作的时候,可以使用智能指引代理。
需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理。
设计模式NO.2的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- json格式数据整理
一,json的两种数据结构 1.1,对象 对象结构以"{"大括号开始,以"}"大括号结束.中间部分由0或多个以","分隔的"key ...
- 小程序中点击input控件键盘弹出时placeholder文字上移
最近做的一个小程序项目中,出现了点击input控件键盘弹出时placeholder文字上移,刚开始以为是软键盘弹出布局上移问题是传说中典型的fixed 软键盘顶起问题,因此采纳了网上搜到的" ...
- SAXParser解析xml文件
对于xml的解析,这里学习并演示使用SAXParser进行解析的样例. 使用此种方法无法解析"gb2312"编码的xml文件,因此,此处xml文件编码设置为"UTF-8& ...
- 第三篇:一个Spark推荐系统引擎的实现
前言 经过2节对MovieLens数据集的学习,想必读者对MovieLens数据集认识的不错了:同时也顺带回顾了些Spark编程技巧,Python数据分析技巧. 本节将是让人兴奋的一节,它将实现一个基 ...
- C#总结(六)EventBus事件总线的使用-自己实现事件总线
在C#中,我们可以在一个类中定义自己的事件,而其他的类可以订阅该事件,当某些事情发生时,可以通知到该类.这对于桌面应用或者独立的windows服务来说是非常有用的.但对于一个web应用来说是有点问题的 ...
- js 实现table每列可左右拖动改变列宽度 【转载】
<!DOCTYPE HTML> <html> <head> <meta charset="gbk"> <title>ta ...
- 索信达携手8Manage,打造项目管理系统信息化体系
[导语]金融大数据已逐渐成为行业潮流,作为金融大数据应用提供商,深圳索信达企业为了实现业务和研发项目的多重管理需求,决定引入8Manage项目管理系统,提高项目管控能力和工作效率,从而提高企业的核心竞 ...
- IO模式和IO多路复用
网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 1 基础知识回顾 注意:咱们下面说的都是Lin ...
- 设计模式——组合模式(C++实现)
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 是一种结构型模式 使用场景: 1.用于对象的部分-整体层次结构,如树 ...
- 制作centos的启动盘
制作centos的U盘启动盘 author:headsen chen 2017-10-13 10:24:50 个人原创,允许转载,请注明作者,出处,否则依法追究法律责任! 1,下载Ultr ...