设计模式:前人对编写java代码的套路的总结,java一共有23种通用设计模式。 装饰设计模式和单例设计模式就起其中的两种。
装饰设计模式
- 装饰设计模式主要的能力,是通过装饰者包装被装饰者,在被装饰者原有的功能的基础 上,增加额外的能力。
- 装饰设计模式实现方式:
A.写一个类 使其具有和被装饰者相同的方法
B.提供构造方法 将被装饰者 传入保存在类的内部
C.对于不想改造的方法直接调用原有对象本来的方法
D.对于想改造的方法 进行改造。
E.对于想增加的方法 直接增加。
这样可以将被装饰者传入,装饰,增加特定的功能。
3.装饰设计模式可以改变的是 已有对象身上的方法 但是编写的方式相对较麻烦 特别是原来的类 方法比较多的情况下 冗余的代码非常的多.因此介绍一种其他方法改变已有对象身上不喜欢的方法------动态代理.(感兴趣可了解一下)
例子:
/**
* 普通的Person
* 只能 吃饭睡觉
*/
class Person{
public void eat(){
System.out.println("人在么么么么么的吃。。。。");
}
public void sleep(){
System.out.println("人在呼噜呼噜的睡。。。。");
}
/**
* 超人 Super_Person
* 可以传入一个Person 在原有Perosn的基础上 增加了打怪兽的能力
*
* 实现步骤:
* 提供构造方法 将被装饰者传入 保存在类的内部
* 对于不想改造的方法 直接提供相同方法 调用被装饰者相同的方法
* 对于想改造的方法 直接改造
* 对于想增加的方法 直接增加
*/
class Super_Person{
private Person p =null;
public Super_Person(Person p ){
this.p =p;
}
public void hitMonster{
System.out.println("打怪兽");
}
public void eat() {
p.eat();
}
public void sleep() {
p.sleep();
}
}
public class Demo{
public static void main(String[] args) {
Person p = new Person();
Super_Person sp = new Super_Person(p);
sp.eat();
sp.sleep();
//额外增加的能力!!!
sp.hitMonster();
}
}
单例设计模式
1.单例设计模式设计目的:实现某个类只有一个对象效果(类似于中央集权制O(∩_∩)O)
2.分类:
(1)懒汉式
A.将类的构造方法私有化
B.在类内部提供静态的当前类的对象 最开始为null
C.当有人调用获取对象的方法时 临时判断 保存在类的内部的对象是否为null 如果为null 就赋值后返回 如果不为null 直接返回
C.这种方式在多线程场景下有多线程并发安全问题的风险 需要用synchronized来同
步且效率比较低下
通俗的讲就是当你需要的才给你办,冷不丁的插队容易造成线程拥堵,所以要synchronized来同步
(2)饿汉式
A. 将类的构造方法私有化
B.在类的内部提供静态的当前类的对象 直接就赋值
C. 当有人调用获取对象的方法时 直接返回该对象
D. 效率比较高 但是 在类加载 单对象还未被使用时 就创建了对象 比较占用控制
推荐用这种方式
通俗的讲就是一开始就设置静态类的对象且直接赋值,使得你类加载即一开始即的时候就能调用.
例子:
/**
* 单例设计模式案例:总统只能有一个
*
* 懒汉式
*/
class President{
private string name ;
private static President p =null;
private President (String name){
this.name=name;
}
public static President getPname(){
synchronized (President.class) {
if (p == null) {
p = new President("川普");
}
return p;
}
}
public String getName() {
return name;
}
}
public class Demo01 {
public static void main(String[] args) {
//1.线程1
President.getPname();
//1.线程2
President.getPname();
}
}
/**
* 单例设计模式案例:总统只能有一个
*
* 饿汉式
*/
class President{
private String name;
private static President p =new President("川普");
private President (String name){
this.name=name;
}
public static President getPname(){
return p;
}
public String getName() {
return name;
}
}
public class Demo02 {
public static void main(String[] args) {
//1.线程1
President.getPname();
//1.线程2
President.getPname();
}
}
如有问题还请多多指出,多多指教.?