JavaRush /Blog Java /Random-MS /Aras 37. Jawapan kepada soalan temu bual mengenai topik a...
lichMax
Tahap
Санкт-Петербург

Aras 37. Jawapan kepada soalan temu bual mengenai topik aras

Diterbitkan dalam kumpulan
Hello. Sekali lagi, saya juga tidak menemui jawapan kepada soalan-soalan ini. Saya memutuskan untuk menyiarkan jawapan yang saya susun untuk diri saya sendiri. Tahap 37. Jawapan kepada soalan temu bual mengenai topik tahap - 1Berikut adalah soalan sebenar: Soalan untuk temu duga:
  1. Apakah corak reka bentuk?
  2. Apakah corak reka bentuk yang anda tahu?
  3. Beritahu kami tentang corak Singleton? Bagaimana untuk menjadikannya selamat?
  4. Beritahu kami tentang corak Kilang?
  5. Beritahu kami tentang corak AbstractFactory
  6. Beritahu kami tentang corak Adaper, perbezaannya daripada Wrapper?
  7. Beritahu kami tentang corak Proksi
  8. Apakah iterator? Apakah antara muka yang berkaitan dengan iterator yang anda tahu?
  9. Mengapa kita memerlukan kelas Arrays?
  10. Mengapakah kita memerlukan kelas Koleksi?
Inilah jawapan saya: Jawapan saya:
  1. Corak reka bentuk adalah penyelesaian yang mantap dan berjaya kepada masalah paling biasa yang timbul semasa reka bentuk dan pembangunan program atau bahagiannya.

  2. Singleton, Factory, Abstract Factory, Template method, Strategy, Pool, Adapter, Proxy, Bridge, MVC.

  3. Apabila anda memerlukan hanya satu contoh kelas untuk wujud dalam program, corak digunakan Singleton. Ia kelihatan seperti ini (pemulaan malas):

    clas Singleton {
    	private Singleton instance;
    
    	private Singleton() {}
    
    	public static Singletot getInstance() {
    		if (instance == null)
    			instance = new Singleton();
    		return instance;
    	}
    }

    Untuk menjadikannya selamat, anda boleh menambahkan getInstance()pengubah suai pada kaedah synchronized. Tetapi ini bukan penyelesaian terbaik (tetapi yang paling mudah). Penyelesaian yang lebih baik ialah menulis kaedah getInstancedengan cara ini (penguncian dua kali):

    public static synchronized Singleton getInstance() {
    	if (instance == null)
    		synchronized(Singleton.class) {
    			instance = new Singleton();
    		}
    	return instance;
    }

  4. Corak Factoryialah corak generatif. Ia membolehkan anda membuat objek atas permintaan (contohnya, dalam keadaan tertentu). Ia kelihatan seperti ini:

    class Factory{
    	public static Object1 getObject1() {
    		return new Object1();
    	}
    
    	public static Object2 getObject2() {
    		return new Object2();
    	}
    
    	public static Object3 getObject3() {
    		return new Object3();
    	}
    }

    Terdapat juga variasi corak ini dipanggil FactoryMethod. Mengikut corak ini, objek berbeza dicipta dalam satu kaedah, bergantung pada data input masuk (nilai parameter). Semua objek ini mesti mempunyai nenek moyang yang sama (atau antara muka biasa yang boleh dilaksanakan). Ia kelihatan seperti ini:

    class FactoryMethod {
    	public enum TypeObject {
    		TYPE1,
    		TYPE2,
    		TYPE3
    	}
    
    	public static CommonClass getObject(TypeObject type) {
    		switch(type) {
    			case TYPE1:
    				return new Object1();
    			case TYPE2:
    				return new Object2();
    			case TYPE3:
    				return new Object3();
    			default:
    				return null;
    		}
    	}
    }

    Kelas Object1, Object2dan Object3warisi daripada kelas CommonClass.

  5. Corak Abstract Factoryjuga merupakan corak reka bentuk generatif. Mengikut corak ini, sebuah kilang abstrak dicipta yang berfungsi sebagai templat untuk beberapa kilang konkrit. Berikut ialah contoh:

    class Human {}
    
    class Boy extends Human {}
    class TeenBoy extends Human {}
    class Man extends Human {}
    class OldMan extends Human {}
    
    class Girl extends Human {}
    class TeenGirl extends Human {}
    class Woman extends Human {}
    class OldWoman extends Human {}
    
    interface AbstractFactory {
    	Human getPerson(int age);
    }
    
    class FactoryMale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Boy();
    		if (age >= 12 && age <= 20)
    			return new TeenBoy();
    		if (age > 20 && age < 60)
    			return new Man();
    		return new OldMan();
    	}
    }
    
    сlass FactoryFemale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Girl();
    		if (age >= 12 && age <= 20)
    			return new TeenGirl();
    		if (age > 20 && age < 60)
    			return new Woman();
    		return new OldWoman();
    	}
    }

  6. Corak Adapterialah corak struktur. Pelaksanaannya membolehkan objek satu jenis digunakan di mana objek jenis lain diperlukan (biasanya jenis abstrak). Contoh pelaksanaan corak ini:

    interface TotalTime {
    	int getTotalSeconds();
    }
    interface Time {
    	int getHours();
    	int getMinutes();
    	int getSeconds();
    }
    
    class TimeAdapter extends TotalTime {
    	private Time time;
    	public TimeAdapter(Time time) {
    		this.time = time;
    	}
    	public int getTotalTime() {
    		return time.getSeconds + time.getMinutes * 60 + time.getHours * 60 * 60;
    	}
    }
    
    class TotalTimeAdapter extends Time {
    	private TotalTime totalTime;
    	public TotalTimeAdapter(TotalTime totalTime) {
    		this.totalTime = totalTime;
    	}
    
    	public int getSeconds() {
    		return totalTime % 60;
    	}
    
    	public int getMinutes() {
    		return (totalTime / 60) % 60;
    	}
    
    	public int getHours() {
    		return totaltime/ (60 * 60) ;
    	}
    }
    
    class Main {
    	public static void main(String[] args) {
    		Time time = new Time() {
    			public int getSeconds() {
    				return LocalTime.now().getSecond();
    			}
    
    			public int getMinutes() {
    				return LocalTime.now().getMinute();
    			}
    
    			public int getHours() {
    				return LocalTime.now().getHour() ;
    			}
    		};
    
    		TotalTime totalTime = new TimeAdapter(time);
    		System.out.println(totalTime.getTotalSeconds());
    
    		TotalTime totalTime2 = new TotalTime() {
    			public int getTotalSeconds() {
    				LocalTime currTime = LocalTime.now();
    				return currTime.getSecond() + currTime.getMinute * 60 + currTime.getHour * 60 * 60;
    			}
    		};
    
    		Time time2 = new TotalTimeAdapter(totalTime2);
    		System.out.println(time2.getHours + ":" + time2.getMinutes() + ":" + time2.getSeconds());
    	}
    }

    Apabila melaksanakan corak Wrapper, kelas dicipta yang membalut kelas asal dan melaksanakan antara muka yang sama yang dilaksanakan oleh kelas asal. Oleh itu, ia membolehkan anda memanjangkan fungsi kelas asal dan menggunakan kelas baharu di mana kelas asal dijangka digunakan. Ini berbeza daripada melaksanakan corak Adapterdalam hal ini antara muka tunggal digunakan (sama dengan kelas asal). Corak Adaptermenggunakan dua antara muka, dan kelas yang membungkus contoh kelas asal melaksanakan antara muka yang sama sekali berbeza, bukan antara muka kelas asal.

  7. Corak Proxyialah corak reka bentuk struktur. Ia diperlukan untuk mengawal akses kepada beberapa objek. Untuk melakukan ini, kelas jenis "pembungkus" ditulis, iaitu, objek asal yang melaksanakan antara muka tertentu diluluskan di dalam kelas, kelas itu sendiri juga melaksanakan antara muka ini, dan dalam setiap kaedah kelas ini kaedah yang serupa dipanggil pada objek asal. Melaksanakan antara muka yang sama seperti objek asal membolehkan anda menggantikan objek asal dengan objek proksi. Ini juga membolehkan, tanpa mengubah objek asal, untuk "melampirkan" beberapa fungsi tambahan khas pada kaedahnya (contohnya, pengelogan, menyemak hak akses, caching, dll.). Contoh:

    interface Bank {
    	void setUserMoney(User user, double money);
    	double getUserMoney(User user);
    }
    
    class CitiBank implements Bank { //оригинальный класс
    	public void setUserMoney(User user, double money) {
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		UserDAO.getUserMoney(user);
    	}
    }
    
    class SecurityProxyBank implements Bank {
    	private Bank bank;
    
    	public SecurityProxyBank(Bank bank) {
    		this.bank = bank;
    	}
    
    	public void setUserMoney(User user, double money) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't change money value");
    
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't get money value");
    
    		UserDAO.getUserMoney(user);
    	}

  8. Iterator ialah objek dalaman khas koleksi yang membolehkan anda mengulang secara berurutan melalui elemen koleksi ini. Objek ini mesti melaksanakan antara muka Iterator<E>, atau ListIterator<E>(untuk senarai). Selain itu, untuk mengulangi elemen koleksi, koleksi mesti menyokong Iterable<E>. Antara muka Iterable<E>mengandungi hanya satu kaedah iterator(), yang membolehkan anda mengakses iterator koleksi dari luar.

    Antara muka Iterator<E>mengandungi kaedah berikut:

    • boolean hasNext()— menyemak sama ada terdapat unsur lain dalam koleksi

    • E next()— membolehkan anda mendapatkan elemen koleksi seterusnya (selepas menerima elemen, kursor lelaran dalaman bergerak ke elemen koleksi seterusnya)

    • void remove()- mengalih keluar elemen semasa daripada koleksi

    Интерфейс же ListIterator<E> содержит такие методы:

    • boolean hasNext() — проверяет, существуют ли ещё один элемент в коллекции (следующий за текущим)

    • E next() — возвращает очередной элемент коллекции (и передвигает внутренний курсок итератора на следующий элемент)

    • int nextIndex() — возвращает индекс следующего element

    • void set(E e) — устанавливает meaning текущего element void add(E e). Добавляет элемент в конец списка.

    • boolean hasPrevious() — проверяет, существует ли Howой-то элемент в коллекции перед данным элементом

    • E previous() — возвращает текущий элемент коллекции и переводит курсор на предыдущий элемент коллекции

    • int previousIndex — возвращает индекс предыдущего element коллекции

    • void remove() — удаляет текущий элемент коллекции

    • void add(E e) — добавляет элемент e после текущего element коллекции

  9. Класс Arrays — это утorтарный класс, предназначенный для разнообразных манипуляций с массивами. В этом классе есть методы превращения массива в список, поиска по массиву, копирования массива, сравнения массивов, получения хешcodeа массива, представление массива в виде строки и др.

  10. Класс Collections — это утorтарный класс для работы с коллекциями. В этом классе есть методы добавления элементов в коллекцию, наполнения коллекции elementми, поиска по коллекции, копировании коллекции, сравнения коллекции, нахождения максимального и минимального элементов коллекции, а также методы получения специфический модификаций коллекций известных типов (например, можно получить потокобезопасную коллекции or неизменяемую коллекцию с одним элементом).

Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION