(1) 模板方法設計模式
模板方法( Method)模式的定義如下:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。它是一種類【行為型模式】。
該模式的主要優點如下:
1. 它封裝了不變部分,擴展可變部分。它把認為是不變部分的算法封裝到父類中實現,而把可變部分算法由子類繼承實現,便于子類繼續擴展。
2. 它在父類中提取了公共的部分代碼,便于【代碼復用】。
3. 部分方法是由子類實現的,因此子類可以通過擴展方式增加相應的功能,符合開閉原則。
該模式的主要缺點如下。
1.對每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象,間接地增加了系統實現的復雜度。
2. 父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這導致一種反向的控制結構,它提高了代碼閱讀的難 度。
3. 由于繼承關系自身的缺點,如果父類添加新的抽象方法,則所有子類都要改一遍。
咱們寫一個例子:
一個囚犯()的一天,起床 吃飯 勞動 吃飯 勞動 看新聞 吃飯 睡覺對于一個囚犯來說每天都是這樣來的。
public abstract class Prisoner {
protected String name;
/**
* 勞動的方法
*/
abstract void work();
/**
* 吃的方法
*/
abstract void eat();
/**
* 看新聞
*/
abstract void readNews();
/**
* 一天的生活
*/
public void life(){
eat();
work();
eat();
work();
eat();
readNews();
}
}
public class Star extends Prisoner{
public Star(String name) {
this.name = name;
}
@Override void work() {
System.out.println(this.name + "一直很煩惱的干活!");
}
@Override void eat() {
System.out.println(this.name + "吃不下牢里的飯");
}
@Override
void readNews() {
System.out.println(this.name + "一邊看新聞,一邊想選妃的輝煌時刻。");
}
}
public class Visitor {
public void visit(Prisoner prisoner){
System.out.println("我開始參觀體會囚犯的一天");
prisoner.life();
System.out.println("一天的參觀結束");

}
public static void main(String[] args) {
Prisoner wxf = new Star("張三");
Visitor jerry = new Visitor();
jerry.visit(wxf);
}
}
//我開始參觀體會囚犯的一天張三吃不下牢里的飯
//張三一直很煩惱的干活! 張三吃不下牢里的飯
//張三一直很煩惱的干活! 張三吃不下牢里的飯
//張三一邊看新聞,一邊想選妃的輝煌時刻。一天的參觀結束
這樣設計有什么好處:
每一個子類都不需要關心每天的生活流程,因為法律已經規定了。每一類人根據自己的特性、狀態需求完成自己的實現就好了。
java程序員必備的基礎知識_java面向對象之設計模式(二)
(2)策略設計模式
策略設計模式有難度,可以不學
聊一聊對象數組排序,要排序就要有個兩兩比較的過程。
我們怎么比較兩個對象,取出每一個值進行比較也行,但是寫出的代碼不優雅,還記得我們學過的equals方法嗎?
我們既然能做等值比較,為什么不能做大小的比較呢?
public class User {
private String username;
private Integer age;
private Double height;
public User(String username, Integer age, Double height) {
this.username = username;
this.age = age;
this.height = height;
}
//get、set方法略
@Override
public String toString() {
return "User{" +"username='" + username +
'\'' + ", age=" + age +
", height=" + height + '}';
}
public static void main(String[] args) {
User user1 = new User("小王",12,153.4);
User user2 = new User("小李",14,163.4);
User user3 = new User("小張",13,123.4);
User user4 = new User("小楊",42,126.4);
User[] users = {user1,user2,user3,user4};
for (int i = 0; i < users.length-1; i++) {
for (int j = 0; j < users.length - i -1; j++) {
if(users[j].age > users[j+1].age){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
for (int i = 0; i < users.length; i++) {
System.out.println(users[i]);
}
}
}
//結果沒問題:

//User{username='小楊', age=4, height=6.4}
//User{username='小王',age=12,height=153.4}
//User{username='小張',age=13,height=123.4}
//User{username='小李',age=14,height=163.4}
//這樣有什么問題啊,
public class User implements Comparable {
private String username;
private Integer age;
private Double height;
public User(String username, Integer age, Double height) {
this.username = username; this.age = age; this.height = height;
}
//get、set方法略
@Override
public String toString() {
return "User{" +
"username='" +
username + '\'' +
", age=" + age +
", height=" + height + '}';
}
public static void main(String[] args) {
User user1 = new User("小王",12,153.4);
User user2 = new User("小李",14,163.4);
User user3 = new User("小張",13,123.4);
User user4 = new User("小楊",4,6.4);
User[] users = {user1,user2,user3,user4};
for (int i = 0; i < users.length-1; i++) {
for (int j = 0; j < users.length - i -1; j++) {
if(users[j].compare(users[j+1]) > 0){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
for (int i = 0; i < users.length; i++) {
if(users[j].compare(users[j+1]) > 0){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
for (int i = 0; i < users.length; i++) {
System.out.println(users[i]);
}
}
@Override
public int compare(Object object) {
if(object instanceof User){
User user = (User)object;
if(this == user){
return 0;
} else {
if(this.getAge() > user.getAge()){
return 1;

} else if (this.getAge() < user.getAge()){
return -1;
} else {
return 0;
}
}
}
return -1;
}
}
對于上邊的編寫代碼的方式,我們看看有沒有什么值得優化的地方?
如果我們想修改比較的內容,就必須修改User類,這很明顯違反了開閉原則。
1、User不變
2、寫一個比較器的接口
public interface Comparator {
int compare(User user1,User user2);
}
3、寫一個比較器
public class UserAgeComparator implements Comparator {
@Override
public int compare(User user1, User user2) {
return user1.getAge() - user2.getAge();
}
}
4、寫一個工具類專門給User排序
public class SortUtil {
public void sort(User[] users, Comparator comparator){
for (int i = 0; i < users.length-1; i++) {
for (int j = 0; j < users.length - i -1; j++) {
if(comparator.compare(users[j],users[j+1]) > 0){
User temp = users[j];
users[j] = users[j+1];
users[j+1] = temp;
}
}
}
}
}
5、排序開始
public static void main(String[] args) {
User user1 = new User("小王",12,153.4);
User user2 = new User("小李",14,163.4);
User user3 = new User("小張",13,123.4);
User user4 = new User("小楊",4,6.4);
User[] users = {user1,user2,user3,user4};
new SortUtil().sort(users,new UserAgeComparator());
for (int i = 0; i < users.length; i++) {
System.out.println(users[i]);
}
}
它好在哪里了呢?
如果將來我們需要按照身高或者其他的方式排序呢?
我們再寫一個排序的比較器就行了:
public class UserAgeComparator implements Comparator{
@Override
public int compare(User user1, User user2) {
return user1.getAge() - user2.getAge();
}
}
同時User也不需要直接實現某些接口,是不是很棒。
其實我們還能結合我們超級數組來使用,大家不妨試一試。
win10共享打印機找不到打印機 找不到打印機設備解決
在Windows 10系統中,有時候共享打印機可能無法在網絡中顯示,導致打印機無法使用。這通常會讓人感到非常困擾,但幸運的是,這個問題有很多可以嘗試的解決方法。本文將介紹一些常見的原因以及針對性的解決步驟,幫助你快速解決Windows 10共享打印機找不到的問題。
一、檢查打印機共享設置
首先,確保打印機的共享功能已正確啟用。沒有正確設置打印機共享功能時,其他電腦是無法檢測到該打印機的。
步驟:
1. 在安裝打印機的電腦上,打開“控制面板”。
2. 選擇“設備和打印機”。
3. 右鍵點擊你要共享的打印機,選擇“打印機屬性”。
4. 在彈出的窗口中,切換到“共享”選項卡。
5. 勾選“共享此打印機”選項,并為打印機設置一個共享名(最好簡潔明了)。
二、更新打印機驅動程序
過時或損壞的打印機驅動程序也是導致共享打印機無法連接的常見原因之一。我們可以嘗試使用打印機衛士更新打印機驅動程序來解決這個問題。
打印機衛士(官方版)
智能修復打印機問題,自動安裝打印機驅動
立即下載
好評率97%
下載次數:3665356
步驟:
1. 在打印機正常連接到電腦的前提下,打開打印機衛士,點擊“立即檢測”。
2. 如果顯示打印機問題需要處理,點擊“一鍵修復”。
3. 等待修復成功后,重啟打印機,讓新版驅動正常生效。
三、確保網絡發現已開啟
在Windows 10中,網絡發現功能決定了你的電腦是否能夠看到其他設備,包括共享的打印機。如果網絡發現沒有啟用,打印機將無法被其他電腦檢測到。
步驟:
1. 打開“控制面板”,點擊“網絡和共享中心”。
2. 在左側欄選擇“更改高級共享設置”。
3. 確保“打開網絡發現”和“打開文件和打印機共享”選項被選中。
4. 點擊“保存更改”以確保設置生效。
四、檢查防火墻設置
防火墻設置也有可能會干擾打印機共享的正常工作。Windows防火墻默認情況下會阻止一些打印機共享協議。為了確保共享打印機的連接沒有被防火墻攔截,可以暫時禁用防火墻進行測試。
步驟:
1. 打開“控制面板”,點擊“Windows 防火墻”。
2. 在左側欄選擇“啟用或關閉Windows 防火墻”。
3. 在公用網絡和私人網絡下都選擇“關閉Windows 防火墻(不推薦)”。
4. 關閉防火墻后,再嘗試連接共享打印機。
五、手動添加共享打印機
如果上述方法都無法解決問題,你可以手動添加共享打印機。
步驟:
1. 打開“控制面板” > “設備和打印機”。
2. 點擊“添加打印機”。
3. 在彈出的窗口中,選擇“我想要的打印機不在列表中”。
4. 選擇“通過TCP/IP地址或主機名添加打印機”。
5. 輸入共享打印機的IP地址或者主機名,完成添加。
以上就是win10共享打印機找不到打印機的解決方法,希望對你有幫助。如果有遇到打印機連接、共享、報錯等問題,可以下載“打印機衛士”進行立即檢測,只需要一步便可修復問題,提高大家工作和打印機使用效率。
打印機衛士(官方版)
智能修復打印機問題,自動安裝打印機驅動
立即下載
好評率97%
下載次數:3665356
win10共享打印機共享打印機找不到打印機找不到打印機設備共享打印機