黑马程序员——java中的设计模式

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

设计模式:
经验的总结。

A:创建型 创建对象
B:结构型 对象的组成
C:行为型 对象的功能

创建型模式:
1:简单工厂模式
提供抽象类(动物),让具体类(猫、狗)去继承抽象类,并重写抽象方法实现特有功能。
提供工厂类,通过该类根据传递的参数去造具体类的对象。

2:工厂方法模式
提供抽象类(动物)和工厂接口(抽象方法),当需要创建特定对象时,让具体类(猫或狗)实现抽象类
然后再去实例化工厂接口,提供创建特定对象的方法(造猫对象的工厂或造狗对象的工厂)

3:单例设计模式:保证类在内存中只有一个对象
  A:把构造方法私有
B:在成员位置自己创建一个对象(静态对象)
C:通过一个公共的方法提供访问(静态方法)
两种模式:
饿汉模式:类一加载就创建对象,即把创建的对象定义为静态
private static Student s = new Student();
public static Student getStudent() {
return s;
}
懒汉模式:什么时候用什么时候创建
private static Teacher t = null;
public synchronized static Teacher getTeacher() {
if (t == null) {
t = new Teacher();
}
return t;
}
因为懒汉模式中设计到多条语句操作共享数据,有线程安全问题,所以要写成同步方法。

4.模板设计模式:定义一个算法的骨架,而将具体的算法延迟到子类中来实现
如我要计算一个程序从开始运行到结束所用的时间,那么我就可以定义一个计算时间的算法骨架抽象类
让具体的的程序来继承这个算法类,然后创建对象来得到具体的时间
具体实现步骤:
A:定义算法骨架

public abstract class GetTime {
				public long getTime() {
					long start = System.currentTimeMillis();
					code();
					long end = System.currentTimeMillis();
					return end - start;
				}
				public abstract void code();
			}
B:实现具体算法

public class ForDemo extends GetTime {
				@Override
				public void code() {
					for (int x = 0; x < 100000; x++) {
						System.out.println(x);
					}
				}
			}
C:得到具体结果

public class GetTimeDemo {
				public static void main(String[] args) {
					GetTime gt = new ForDemo();
					System.out.println(gt.getTime() + "毫秒");
				}
			}
5.装饰设计模式
使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案
把手机的打电话功能定义为一个接口,创造一个抽象类实现该接口,使其具有打电话的功能
创建一个可以听音乐的具体手机类,使其继承上面的抽象类,则该手机类具有了打电话和听音乐的功能
则听音乐就是可以看成是抽象手机类的一个装饰,以后再需要什么样的装饰只需直接创建子类对象即可。
具体实现:

<span style="white-space:pre">			</span>public interface Phone {
				public abstract void call();
			}
			public abstract class PhoneDecorate implements Phone {
				private Phone p;
				public PhoneDecorate(Phone p) {
					this.p = p;
				}
				@Override
				public void call() {
					this.p.call();
				}
			}
			public class MusicPhoneDecorate extends PhoneDecorate {
				public MusicPhoneDecorate(Phone p) {
					super(p);
				}
				@Override
				public void call() {
					super.call();
					System.out.println("手机可以听音乐");
				}
			}
			public class RingPhoneDecorate extends PhoneDecorate {
				public RingPhoneDecorate(Phone p) {
					super(p);
				}
				@Override
				public void call() {
					System.out.println("手机可以听彩铃");
					super.call();
				}
			}
			public class PhoneDemo {
				public static void main(String[] args) {
					Phone pd = new MusicPhoneDecorate(p);
					pd.call();
					System.out.println("------------");
					pd = new RingPhoneDecorate(p);
					pd.call();
				}
			}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一夸克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值