JAVASE基础模块三十九(装饰模式 观察者模式 网络编程三要素 传输协议 端口号 IP概述)
设计模式
装饰模式
- 概述:装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案
- 优点:使用装饰模式 可以提供比继承更灵活的扩展对象的功能 它可以动态的添加对象的功能 并且可以随意的组合这些功能
- 缺点:正因为可以随意组合,所以就可能出现一些不合理的逻辑
public class ZhuangShi {
public static void main(String[] args) {
Iphone i = new Iphone();
i.call();
System.out.println("===========================");
MusicPhone m = new MusicPhone(i);
m.call();
System.out.println("===========================");
VideoPhone v = new VideoPhone(i);
v.call();
System.out.println("===========================");
MusicPhone m1 = new MusicPhone(new VideoPhone(i));
m1.call();
}
}
interface Phone {
public abstract void call();
}
class Iphone implements Phone {
@Override
public void call() {
System.out.println("call somebody");
}
}
class BaoZhuang implements Phone {
private Phone i;
public BaoZhuang(Phone i) {
this.i = i;
}
@Override
public void call() {
i.call();
}
}
class MusicPhone extends BaoZhuang {
public MusicPhone(Phone i) {
super(i);
}
@Override
public void call() {
super.call();
System.out.println("listen music");
}
}
class VideoPhone extends BaoZhuang {
public VideoPhone(Phone p) {
super(p);
}
@Override
public void call() {
super.call();
System.out.println("see movie");
}
}
运行结果:
call somebody
===========================
call somebody
listen music
===========================
call somebody
see movie
===========================
call somebody
see movie
listen music
观察者模式
A: 案例: 找猎头找工作
B: 观察者 = 订阅者 + 发布者
岗位类 求职者 猎头(注册方法,注销方法,发布方法)
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
worker w1 = new worker("xxxx");
worker w2 = new worker("cccc");
worker w3 = new worker("ssss");
Hunter h = new Hunter();
h.addWoker(w1);
h.addWoker(w2);
h.addWoker(w3);
Job j = new Job("java", 7777);
h.addJob(j);
}
}
class worker {
private String name;
public worker(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Job {
private String jobname;
private double price;
public Job() {
}
public Job(String jobname, double price) {
this.jobname = jobname;
this.price = price;
}
public String getJobname() {
return jobname;
}
public double getPrice() {
return price;
}
}
class Hunter {
private ArrayList<worker> wokerlist = new ArrayList<>();
private ArrayList<Job> joblist = new ArrayList<>();
public void addWoker(worker w) {
wokerlist.add(w);
}
public void removeWoker(worker w) {
wokerlist.remove(w);
}
public void addJob(Job j) {
joblist.add(j);
notifyAllWoker(j);
}
private void notifyAllWoker(Job j) {
for (worker worker : wokerlist) {
System.out.println(worker.getName()+"你好! 有一份工作"+j.getJobname()+"薪资:"+j.getPrice()+"欢迎你前去面试"); }
}
}
运行结果:
xxxx你好! 有一份工作java薪资:7777.0欢迎你前去面试
cccc你好! 有一份工作java薪资:7777.0欢迎你前去面试
ssss你好! 有一份工作java薪资:7777.0欢迎你前去面试
网络编程
网络编程
- 计算机网络:是将地理位置不同的具有独立功能的多态计算机及其外部设备,通过通信线路连接起来,实在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
- 网络编程:就是用来实现网络互联的不同计算机上运行的程序间可以进行数据交换
网络模型概述
- 概述:计算机网络之间以何种规则进行通信 就是网络模型研究问题
- 网络模型一般是指
- OSI(Open System Interconnection)七层参考模型
- TCP/IP四层参考模型 主机至网络层(物理层 数据链路层) 网际层 传输层 应用层(应用层 表示层 会话层)
网络编程三要素
一:IP概述
- 概述:InetAddress:网络设备的标识 不易记忆 可用主机名
- IP概述:所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址
- IP地址的组成 IP地址=网络地址+主机地址
- A类IP地址:第一段号码为网络地址 剩下的三段号码为本地计算机的号码
- B类IP地址:前两段号码为网络地址 剩下的两段号码为本地计算机的号码
- C类IP地址:前三段号码为网络地址 剩下的一段号码为本地计算机的号码
- IP地址分类
- A类 1.0.0.1—127.255.255.254
- 10.x.x.x是私有地址(私有地址就是在互联网上不使用 而被用在局域网络中的地址)
- 127.x.x.x是保留地址 是做循环测试用的
- B类 128.0.0.1—191.255.255.254
- C类 192.0.0.1—223.255.255.254
- D类 224.0.0.1—239.255.255.254
- E类 240.0.0.1—247.255.255.254
- A类 1.0.0.1—127.255.255.254
- 特殊地址
- 127.0.0.1 回环地址 可用于测试本机的网络是否有问题 ping 127.0.0.1
- ipconfig IP地址
- xxx.xxx.xxx.255 广播地址
类 InterfaceAddress
-
概述
- 此类表示网络接口地址
- 对于 IPv4 地址,是指 IP 地址、子网掩码和广播地址
- 对于 IPv6 地址,是指 IP 地址和网络前缀长度
-
方法摘要
boolean equals(Object obj) 将此对象与指定对象比较。 InetAddress getAddress() 返回此地址的 InetAddress。 InetAddress getBroadcast() 返回此InterfaceAddress广播地址InetAddress short getNetworkPrefixLength() 返回此地址的网络前缀长度 int hashCode() 返回此接口地址的哈希码 String toString() 将此接口地址转换为 String
-
代码
import java.net.InetAddress; import java.net.UnknownHostException; public class Inetadd { public static void main(String[] args) { try { InetAddress s = InetAddress.getByName("弎屲"); System.out.println(s.getHostAddress()); System.out.println(s.getHostName()); } catch (UnknownHostException e) { e.printStackTrace(); } try { InetAddress ss = InetAddress.getByName("192.168.17.201"); System.out.println(ss.getHostAddress()); System.out.println(ss.getHostName()); } catch (UnknownHostException e) { e.printStackTrace(); } } }
运行结果: 192.168.17.201 弎屲 192.168.17.201 192.168.17.201
二:端口号
- 概述:用于标识进程的逻辑地址 不同进程的标识
- 逻辑端口 范围 连个字节 0-65535 其中0-1023被系统所占用
三:传输协议
- 概述:通讯的规则常见协议:TCP UDP
- UDP:通信两端不需要建立连接 属于不可靠连接 数据有可能丢失 发送的数据大小有限制 因此不需要建立连接 所以传输效率比较高 例如:发短信
- TCP:通信两端需要建立连接 数据可靠协议 发送的数据大小没有限制 因为需要建立连接 例如打电话 视频聊天
网络编程 也称Socket编程
- Socket=IP+端口
- Socket套接字概述:网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字
- Socket原理机制
- 通信的两端都有Socket
- 网络通信其实就有Socket间的通信
- 数据在两个Socket间通过IO传输