Java设计模式 - - 单例模式 装饰者模式

时间:2022-09-22 19:30:02

Java设计模式 单例模式 装饰者模式

作者 : Stanley 罗昊

转载请注明出处和署名,谢谢!

静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/10761604.html

什么是设计模式

设计模式其实就是是写了很多代码的人总结出来的经验!

设计模式是关于一些问题的最佳解决方案;

也就是说,每一个典型的问题,关于一个典型的问题,他都会总结出来一个最佳的解决方案;

就比方说医生问诊:

你挂不同的科室,也就是不同的医生,每个医生都有自己擅长并拿手的治疗方案,关于某一个疾病都有自己独特的解决方案;

设计模式其实也一样,就是通过大量的代码总结出来的一些问题的最佳解决办法;

Java的设计模式一共有23种设计模式;

在这23种设计模式中,你仅掌握3~4种设计模式即可,并且要求能够手写出来

23种设计模式并分为三大类:

1.创建型模式【五种】

工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

2.结构型模式【七种】

适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

3.行为型模式【十一种】

策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

设计模式 -- 六大设计原则

总原则:开闭原则(Open Close Princciple)

对修改关闭,对扩展开放,所有的设计模式都必须遵循这个原则!

也就是说,所有的设计模式,你可以扩展它的功能,但是不可以修改它原始的功能;

六大小原则:

1.单一职责原则

不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分;

2.里氏替换原则

里氏替换原则中,子类对父类的方法尽量不要重写和重载,因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它;

3.依赖倒转原则

这个原则的意思四,每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多张个隔离的接口,比使用单个接口(多个几口方法结合到一个的接口)更好;

4.迪米特法则(最少知道原则)

就是说,一个类对自己的依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部,这样当被依赖的类变化时,才能量最小的影响该类;

6.复合重用原则

尽量首先使用合成/聚合的方式,而不是使用继承的方式;

单例设计模式

单例设计模式是最简单的设计模式

目的:创建全局唯一的实例对象;

1.饿汉模式

在类加载的时候,就创建一个对象,因为就比较饿嘛,上来就创建对象;

2.懒汉模式

需要的时候才创建,因为比较懒,你不拿鞭子抽它,他就不动;

手写单例设计模式

下面呢,我将创建一个类,这个类,我就把它搞成一个单例设计模式;

单例设计模式有三点,第一点:私有的构造器;

第二点:私有的静态属性,并且变量类型与类同名;

第三点:共有的创建实例对象的方法(那我这个方法返回的肯定是一个SingleDemo01类型);

标准的线程安全的单例模式:

public class SingleDemo01{

//1.私有的构造器

private SingleDemo01(){}

//2.私有的静态属性

private static SingleDemo01 single;

//3.公有的创建实例对象的方法

public SingleDemo01getInstance(){

if(single == null)//2个线程

synchronized(SingleDemo01.class){

if(single == null){

single = new SingleDemo01();

}

}
return single;
}
}

装饰者模式

当你需要对某一个类的某一个功能进行增强的时候,就要用到装饰者模式;

下面就举一些例子来完成对装饰者模式的认知:

我现在想对list集合中的add方法进行增强,在添加元素时打印一句“开始添加元素”,添加完成后再打印一句“元素添加完成”;

我们看到以上需求,我们本次采用装饰者模式去实现,去实现之前呢需要注意两点:

1.将要装饰的或包装的类,作为增强类的属性

2.需要实现增强功能

具体实现过程:

首先,我们先定义一个类,叫MyList;

我现在要加强List的add方法,那么首先我就需要让list作为我的成员属性;

定义好一个list泛型类型的属性后,我们需要对它进行赋值,所以我们就再给它提供一个构造函数;

之后呢,我们在类中写一个带参的add方法,那我现在这个add方法是不是就是要对原始的add方法进行增强了;

编码:

public class MyList{

private List<String>list;

public MyList(List<String>list){

super();

this.list = list;

}

public void add (String e){

//添加之前输出一句

System.out.println("start。。。。。。。。。。");

//添加

list.add(e);

//添加之后再输出一句

System.out.println("end。。。。。。。。。。");

}

这个就是装饰者模式,某类中的某一个方法进行增强

//写一个main方法进行测试

public static void main (String[] args){

//先建立一个list集合

List<String>list = new List<String>();

//list集合建完之后,我是不是就再建一个Mylist直接把值穿进去是不是就可以了

MyList my = newMyList(list);

my.add("ss");

}

}

打印输出结果:

Java设计模式 - - 单例模式 装饰者模式

我们看到执行结果,是不是已经按照要求增强了;

这个时候我们还可以继续改进;

改造成只能添加含有start的元素;

我们仅需加一个if判断即可:

public class MyList{

private List<String>list;

public MyList(List<String>list){

super();

this.list = list;

}

public void add (String e){

//添加之前输出一句

System.out.println("start。。。。。。。。。。");

//添加

if(e.contains("start")){//这里我们加了一个判断,表示判断添加进来的元素是否包含start,如果不包含就不进入该方法,也就意味着元素没添加进去

list.add(e);

}

//添加

list.add(e);

//添加之后再输出一句

System.out.println("end。。。。。。。。。。");

}

Java设计模式 - - 单例模式 装饰者模式的更多相关文章

  1. Java 设计模式泛谈&amp&semi;装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  2. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  3. 23种java设计模式之装饰者模式及动态代理

    设计模式不管对于何种语言都是存在的,这里介绍的是java的模式 装饰者模式是在二次开发中应用比较多的一款模式,当然了用反射也是可以实现的,今天介绍的是装饰模式,有兴趣的朋友可以自己去了解一下反射是怎么 ...

  4. java设计模式—Decorator装饰者模式

    一.装饰者模式 1.定义及作用 该模式以对客户端透明的方式扩展对象的功能. 2.涉及角色      抽象构件角色:定义一个抽象接口,来规范准备附加功能的类. 具体构件角色:将要被附加功能的类,实现抽象 ...

  5. Java设计模式之装饰者模式

    要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...

  6. java设计模式之七装饰器模式(Decorator)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...

  7. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  8. Java设计模式之装饰器模式

    1.装饰器模式的定义(保持接口,扩展功能) Decorate装饰器,顾名思义,就是动态的给一个对象添加一些额外的职责,就好比对房子进行装修一样. 2.装饰器模式的特征 具有一个装饰对象. 必须拥有与被 ...

  9. java设计模式之装饰者模式学习

    装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 ...

随机推荐

  1. ajax请求过程中下载文件在火狐下的兼容问题

    项目中碰到的问题,记录如下. 需求很简单,点击一个文件链接下载该文件,同时向后台发送请求.需求很常见,用户点击下载后通常要进行下载量的统计,统计的话可以利用 script标签 或者 img标签(图片p ...

  2. Ubuntu操作系统安装使用教程 (转)

    随着微软的步步紧逼,包括早先的Windows黑屏计划.实施,逮捕番茄花园作者并判刑,种种迹象表明,中国用户免费使用盗版Windows的日子将不会太长久了,那么这个世界上有没有即免费又易用的操作系统呢? ...

  3. HDU 4635 Strongly connected(强连通分量,变形)

    题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...

  4. NAS、DAS和SAN三种存储究竟是什么?

    首先,NAS(Network Attached Storage,网络附加存储)全面改进了以前低效的DAS存储方式,它是采用独立于PC服务器,单独为网络数据存储而开发的一种文件服务器. NAS服务器中集 ...

  5. 神秘链接&lowbar;&lowbar;proto&lowbar;&lowbar;是什么鬼

    _proto_实际上是某个实例对象的隐藏属性,而prototype是其构造器函数(或者说‘类’)的原型属性; function Mine() {} var  hi = new Function(), ...

  6. Android中ListView同过自定义布局并使用SimpleAdapter的方式实现数据的绑定

    1.listview的数据填充可以通过ArrayAdapter,SimpleAdapter,也可以是一个xml文件,但是ArrayAdapter与SimpleAdapter的区别是: 2 ArrayA ...

  7. C&plus;&plus;服务器设计(零):总体设计

    这个系列把毕业论文的部分贴了出来,以作保存留念.整个系列分为三大部分,其中第一章到第三章是介绍服务器的系统层设计,设计思路参考了libevent和muduo等开源代码的实现:第四章到第六章是介绍服务器 ...

  8. Element type &quot&semi;bean&quot&semi; must be followed by either attribute specifications&comma; &quot&semi;&gt&semi;&quot&semi; or &quot&semi;&sol;&gt&semi;&quot&semi;&period;

    在这里其他内容就省了,错在,<bean id="bpcsU1gblDAO"class="dao.jk.bpcs.impl.BpcsU1gblDaoImpl&quot ...

  9. C&num;字典转换成where条件

    where 1=1 and Dictionary[key1]=Dictionary[value1] and Dictionary[key2]=Dictionary[value3].... /// &l ...

  10. mongodb 面试题总结

    mongodb 面试题总结 1 nosql和关系型数据库的区别 2 nosql数据库有哪些 redis mongodb hbase 3 MySQL与mongodb本质之间最基本的差别是什么 差别在多方 ...